假设我有一个看起来像这样的数据框:
user_id date weight
12345 2016-03-07 160
12345 2016-03-06 158
12345 2016-03-05 156
12345 2016-03-04 154
我想通过对weight
列应用多个功能来更改此数据框,然后将每个应用程序的结果保存到新列。一个警告是此函数已参数化,我想将参数值附加到新的列名。例如,如果我使用lag()
:
user_id date weight dweight_1 dweight_2 ...
12345 2016-03-07 160 NA NA
12345 2016-03-06 158 160 NA
12345 2016-03-05 156 158 160
12345 2016-03-04 154 156 158
第一个新列是的结果lag(weight, 1)
,第二个是的结果lag(weight, 2)
,依此类推。
我尝试遵循dplyr插图中针对该主题提出的标准评估方法以及该SO问题的建议,但似乎都无法解决参数化函数的问题(否则我将只使用funs()
!)。
我该如何解决这个问题?
要以编程方式添加dplyr
,您可以使用类似
x <- 2
mutate_(df, .dots = setNames(list(~lag(weight, x)), paste0('dweight_', x)))
如果只是几次(如果愿意,甚至可以将它们链接在一起),您可以重复一遍,但是如果您经常这样做,那么编写一个函数可能很有意义:
dweight <- function(l = 1){
for (i in l){
df <- mutate_(df, .dots = setNames(list(~lag(weight, i)), paste0('dweight_', i)))
}
df
}
您可以传递一个向量:
> dweight(1:4)
user_id date weight dweight_1 dweight_2 dweight_3 dweight_4
1 12345 2016-03-07 160 NA NA NA NA
2 12345 2016-03-06 158 160 NA NA NA
3 12345 2016-03-05 156 158 160 NA NA
4 12345 2016-03-04 154 156 158 160 NA
您可以根据需要编辑该函数:添加数据框参数,以便可以对其进行链接,使用*apply
代替for
,添加参数以传递函数等。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句