首页 > 解决方案 > 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)
)

标签: r

解决方案


一个选项是获取 'threshold'、'lag_day' 和 的所有组合crossing,然后遍历行 ( pmap),transmute以创建感兴趣的列并与原始数据集绑定。这使用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, .)

推荐阅读