在 R 中滞后的单列中移动值
Shift values in single column with lag in R
我有以下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
我已经看到了将列值向上移动的方法,但我真的不想将价格移动到另一个代码。
拜托,我需要一些帮助。谢谢。
我们可以在dplyr
中使用lead
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]
在 base 中没有可用的现成函数来执行此操作,但我们可以使用 tail
并附加 NA
值。
df$Price <- with(df,ave(Price, Code, FUN = function(x) c(tail(x, -2), rep(NA, 2))))
我有以下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
我已经看到了将列值向上移动的方法,但我真的不想将价格移动到另一个代码。
拜托,我需要一些帮助。谢谢。
我们可以在dplyr
lead
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]
在 base 中没有可用的现成函数来执行此操作,但我们可以使用 tail
并附加 NA
值。
df$Price <- with(df,ave(Price, Code, FUN = function(x) c(tail(x, -2), rep(NA, 2))))