删除行以其他行中的值为条件

时间:2013-04-14 16:09:26

标签: r dataframe

我有一个类似于这个的数据集

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解决方案也没关系。

非常感谢您的帮助!

1 个答案:

答案 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)
))