如何获取列的滞后值,并将值粘贴到字符串中矢量化?
例如,假设以下数据框,结果将是列"滞后">
date total_volume lagged
<date> <int> <chr>
2017-01-01 323512 323512
2017-01-02 28014 323512, 28014
2017-01-03 12323 323512, 28014, 12323
2017-01-04 11580 323512, 28014, 12323, 11580
2017-01-05 12161
2017-01-06 10796
2017-01-07 10087
2017-01-08 10406
2017-01-09 11261
2017-01-10 11333
我尝试使用这种方法:
df %>%
mutate(lagged = paste(total_volume[1:row_number()], collapse = ','))
但这会返回错误。 我可以创建一个循环并创建它的函数,但是在 dplyr 中使用该函数时,它无法正常工作。
function(x) {
for (i in 1:nrow(x)){
print(paste(x$total_volume[1:i], collapse = ','))
}
}
您可以将Reduce
函数与accumulate=T
一起使用,它以递归方式应用paste
:
df %>% mutate(lagged = Reduce(function(i,j) paste(i,j,sep=","),total_volume,accumulate=T))
这将返回:
date total_volume lagged
1 2017-01-01 323512 323512
2 2017-01-02 28014 323512,28014
3 2017-01-03 12323 323512,28014,12323
4 2017-01-04 11580 323512,28014,12323,11580
5 2017-01-05 12161 323512,28014,12323,11580,12161
6 2017-01-06 10796 323512,28014,12323,11580,12161,10796
7 2017-01-07 10087 323512,28014,12323,11580,12161,10796,10087
8 2017-01-08 10406 323512,28014,12323,11580,12161,10796,10087,10406
9 2017-01-09 11261 323512,28014,12323,11580,12161,10796,10087,10406,11261
10 2017-01-10 11333 323512,28014,12323,11580,12161,10796,10087,10406,11261,11333
我想你也可以直接调用累积。
这是我想出的,它适用于分组(即:累积在新组开始时重置):
df %>%
group_by(group) %>%
mutate(lagged = accumulate(total_volume, paste, collapse = ',')