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
以创建感兴趣的列并与原始数据集绑定。这使用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, .)
推荐阅读
- git - 有没有办法让 git 自动添加空目录?
- git - 将 Sublime Merge 与 Vagrant 一起使用
- angular - 将下拉值绑定到角度中的相同项嵌套数组属性值?
- python - Django - 将多个参数传递给具有 %s 格式的原始查询
- amazon-web-services - 云文本文件解析器的架构
- filter - ACS:search.in 不支持 odata 过滤器语法中的特殊字符
- postman - 有一些要求邮递员永远挂着 - 怎么办?
- elasticsearch - 弹性搜索错误:JsonGenerationException:无法写入字段名称,需要一个值
- java - 为什么带有 ldap 的 java 安全应用程序没有运行 sun.reflect.Reflection 错误?
- pandas - 转换 45 个数字的一个热编码,我有每个人六个的列表