R根据两个不同的参数创建多个列

标签 r

我有一个数据框,它有 2 列:日期和返回。现在我想改变多个新列,这取决于两个参数:阈值参数和滞后参数。功能很简单。新列计算如下:

var= ifelse(lag(return, n= lag_day)>threshold,return, NA))

如果 lag(return)高于阈值,而不是给我 return -值,否则给我NA .

以下是阈值和 lag_days 的值:
threshold=c(2,4,6)
lag_day=c(1,2,3)

在这里我手动解决我的问题:
test<-df%>%
  mutate(var_t1_lag1= ifelse(lag(return, n= lag_day[1] )>threshold[1],return, NA))%>%
  mutate(var_t2_lag1= ifelse(lag(return, n= lag_day[1] )>threshold[2],return, NA))%>%
  mutate(var_t3_lag1= ifelse(lag(return, n= lag_day[1] )>threshold[3],return, NA))%>%
  mutate(var_t1_lag2= ifelse(lag(return, n= lag_day[2] )>threshold[1],return, NA))%>%
  mutate(var_t2_lag2= ifelse(lag(return, n= lag_day[2] )>threshold[2],return, NA))%>%
  mutate(var_t3_lag2= ifelse(lag(return, n= lag_day[2] )>threshold[3],return, NA))%>%
  mutate(var_t1_lag3= ifelse(lag(return, n= lag_day[3] )>threshold[1],return, NA))%>%
  mutate(var_t2_lag3= ifelse(lag(return, n= lag_day[3] )>threshold[2],return, NA))%>%
  mutate(var_t3_lag3= ifelse(lag(return, n= lag_day[3] )>threshold[3],return, NA))

但是有没有一种解决方案可以让它变得更容易?也许有一个或两个应用功能?

这是我的示例数据框:
df <- tibble(
  date= today()+0:12,
  return=c(1,2.5,2,3,5,6.5,1,9,3,2,4,7,2)
)

最佳答案

一个选项是获取 'threshold'、'lag_day' 和 crossing 的所有组合。 ,然后遍历行(pmap),transmute创建感兴趣的列并与原始数据集绑定(bind)。这使用了 base R 中的一个函数(seq_along)

library(tidyverse)
crossing(threshold = seq_along(threshold), lag_day) %>%
    pmap_dfc(~  
             df %>%
               transmute(!! str_c("var_t", ..1, "_lag", ..2) := 
                  case_when(lag(return, n = ..2) > threshold[..1] ~ return, 
                            TRUE ~ NA_real_))) %>% 
   bind_cols(df, .)

关于R根据两个不同的参数创建多个列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56240199/

相关文章:

r - 在 ggplot2 中使用带有百分号 (%) 的 plotmath

R中选定列的逐行平均值

r - 如何避免 R 世界地图中的断线?

r - igraph从-到值(value)获取优势

删除反向重复行

使用 dplyr 的 R 滤波器矩阵

r - 从 R 数据帧中清理 `Inf` 值

r - 如何避免每次运行 R 脚本时都打印它?

r - 匹配数据框内的 id

r - 如何更有效地将嵌套列表展平为一个列表而不是使用 unlist 方法?