将滞后值粘贴到折叠的字符串/向量中

时间:2017-06-05 18:15:14

标签: r dplyr

如何获取列的滞后值,并将值粘贴到字符串中?

例如,假设以下数据框,结果将是列'滞后'

     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 = ','))
 }
}

2 个答案:

答案 0 :(得分:2)

您可以将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

答案 1 :(得分:0)

我发现你也可以直接调用累积。

这是我提出的,与分组有关(即:累积在新组的开头重置):

df %>%
group_by(group) %>%
mutate(lagged = accumulate(total_volume, paste, collapse = ',')