在数据框UP的单列中移动值,并在另一列中指定滞后

时间:2019-10-29 14:57:49

标签: r dataframe

我想将来自不同国家/地区的价格调整到一个时区,这意味着将一列向上移动在另一列中声明的滞后时间(移动是时差)。

使用这样的示例数据:

example=data.frame(country=c("IT","IT","GR","GR","GR","TR","TR","TR","TR"), 
                   price=c(200,150,300,480,590,638,237,438,555), 
                   shift=c(0,0,1,1,1,2,2,2,2))

如下所示:

        country   price   shift
        IT        200     0
        IT        150     0
        GR        300     1
        GR        480     1
        GR        590     1
        TR        638     2
        TR        237     2
        TR        438     2
        TR        555     2

我想得到以下结果:

        country   price   shift
        IT        200     0
        IT        150     0
        GR        480     1
        GR        590     1
        GR        NA      1
        TR        438     2
        TR        555     2
        TR        NA      2
        TR        NA      2

我尝试使用此线程的解决方案: R: Shift values in single column of dataframe UP 但由于它使用一个滞后值,因此并不完全适用。

2 个答案:

答案 0 :(得分:3)

使用dplyr::lead

library(dplyr)

example %>% 
  group_by(shift) %>% 
  mutate(price = lead(price, unique(shift)))

或使用data.table::shift

library(data.table)

setDT(example)[, price := shift(.(price), type = "lead", n = shift), .(shift)][]

给予

#>   country price shift
#> 1 IT        200     0
#> 2 IT        150     0
#> 3 GR        480     1
#> 4 GR        590     1
#> 5 GR         NA     1
#> 6 TR        438     2
#> 7 TR        555     2
#> 8 TR         NA     2
#> 9 TR         NA     2

答案 1 :(得分:0)

这是一个完全依赖于基本R函数的想法,

example$new_price <- unlist(lapply(split(example, factor(example$country, levels = unique(example$country))), 
                                   function(i) { i1 <- unique(i$shift); 
                                                 i2 <- c(tail(i$price, (nrow(i) - i1))); 
                                                 c(i2, rep(NA, i1)) }))

给出,

  country price shift new_price
1      IT   200     0       200
2      IT   150     0       150
3      GR   300     1       480
4      GR   480     1       590
5      GR   590     1        NA
6      TR   638     2       438
7      TR   237     2       555
8      TR   438     2        NA
9      TR   555     2        NA