我有以下DF:
example=data.frame(Code=c(A1,A1,A1,A2,A2,A2,A2,A3,A3,A3,A3,A3), Week=c(1,2,3,1,2,3,4,1,2,3,4,5), Price=c(10,10,8,4,4,6,6,15,20,20,20,20))
DF看起来像这样:
Code Week Price
1 A1 1 10
2 A1 2 10
3 A1 3 8
4 A2 1 4
5 A2 2 4
6 A2 3 6
7 A2 4 6
8 A3 1 15
9 A3 2 20
10 A3 3 20
11 A3 4 20
12 A3 5 20
我想在不更改DF其余部分的情况下将价格值向上移动两行,但是不能将价格移动到其他代码,例如:
Code Week Price
1 A1 1 8
2 A1 2 NA
3 A1 3 NA
4 A2 1 6
5 A2 2 6
6 A2 3 NA
7 A2 4 NA
8 A3 1 20
9 A3 2 20
10 A3 3 20
11 A3 4 NA
12 A3 5 NA
我已经看到了提高列值的方法,但是我真的不想将价格移到另一个代码上。
请,我需要一些帮助。谢谢。
答案 0 :(得分:0)
我们可以在lead
中使用dplyr
library(dplyr)
df %>% group_by(Code) %>% mutate(Price = lead(Price, 2))
# Code Week Price
# <fct> <int> <int>
# 1 A1 1 8
# 2 A1 2 NA
# 3 A1 3 NA
# 4 A2 1 6
# 5 A2 2 6
# 6 A2 3 NA
# 7 A2 4 NA
# 8 A3 1 20
# 9 A3 2 20
#10 A3 3 20
#11 A3 4 NA
#12 A3 5 NA
或在shift
中的data.table
library(data.table)
setDT(df)[, Price := shift(Price, 2, type = "lead"), Code]
没有可用的就绪函数可以执行此操作,但是我们可以使用tail
并附加NA
值。
df$Price <- with(df,ave(Price, Code, FUN = function(x) c(tail(x, -2), rep(NA, 2))))