我有一个类似于这个的数据集
df1<-data.frame(ID = c(1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4),
YEAR = c(1999, 2000, 2001, 2002, 1999, 2000, 2001, 2002, 1999, 2000, 2001, 2002, 1999, 2000, 2001, 2002),
VALUE = c(1,2,3,3,3,2,5,6,2,3,4,4,2,1,2,1))
ID YEAR VALUE
1 1 1999 1
2 1 2000 2
3 1 2001 3
4 1 2002 4
5 2 1999 3
6 2 2000 2
7 2 2001 5
8 2 2002 6
9 3 1999 2
10 3 2000 3
11 3 2001 4
12 3 2002 4
13 4 1999 2
14 4 2000 1
15 4 2001 2
16 4 2002 1
我想要的是,如果Value第一次低于3,那么前一年具有相同ID的行中的值应设置为NA,否则保持不变。但是,如果在值为2或更低之前存在大于或等于3的值,则不应更改相同ID的其他条目,如ID号2所示。
输出口应该是这样的:
df2<-data.frame(ID = c(1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4),
YEAR = c(1999, 2000, 2001, 2002, 1999, 2000, 2001, 2002, 1999, 2000, 2001, 2002, 1999, 2000, 2001, 2002),
VALUE = c(0,0,3,3,3,2,5,6,0,3,4,4,0,0,0,0))
ID YEAR VALUE
1 1 1999 0
2 1 2000 0
3 1 2001 3
4 1 2002 4
5 2 1999 3
6 2 2000 2
7 2 2001 5
8 2 2002 6
9 3 1999 0
10 3 2000 3
11 3 2001 4
12 3 2002 4
13 4 1999 0
14 4 2000 0
15 4 2001 0
16 4 2002 0
data.table
解决方案也没关系。
非常感谢您的帮助!
答案 0 :(得分:1)
这使用data.frame
,可以扩展为data.table
:
for (i in unique(df1$ID))
{
mask <- (df1[i == df1$ID,'VALUE'] > 2)
mask <- cumsum(mask) == 0
df1[i == df1$ID,'VALUE'][mask] <- 0
}
或更具功能性的方法:
transform(df1, VALUE = ave(VALUE, ID, FUN = function(x)
ifelse(cumsum(x > 2) == 0, 0, x)
))