1

我有一个与这个相似的数据集

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解决方案也可以。

您的帮助将不胜感激!

4

1 回答 1

1

This uses data.frame, can be extended to 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 
}

or this more functional approach:

transform(df1, VALUE = ave(VALUE, ID, FUN = function(x)
  ifelse(cumsum(x > 2) == 0, 0, x)
))
于 2013-04-14T16:40:53.043 回答