我想将来自不同国家/地区的价格调整到一个时区,这意味着将一列向上移动在另一列中声明的滞后时间(移动是时差)。
使用这样的示例数据:
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 但由于它使用一个滞后值,因此并不完全适用。
答案 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