如何在条件下消除观察组

时间:2014-04-06 07:48:36

标签: r subset

我的面板数据如下所示:

id  name    year    dummy
1   Jane    1990    1
1   Jane    1991    1
1   Jane    1992    0
1   Jane    1993    0
2   Tom     1978    0
2   Tom     1979    0
2   Tom     1980    0
3   Jim     1981    1
3   Jim     1982    1
3   Jim     1983    0

我希望对这些数据进行子集,以便将没有1的人排除为dummy变量。这意味着在上面的示例中,我想消除对Tom的观察,因为他没有dummy变量1。通缉输出是:

id  name    year    dummy
1   Jane    1990    1
1   Jane    1991    1
1   Jane    1992    0
1   Jane    1993    0
3   Jim     1981    1
3   Jim     1982    1
3   Jim     1983    0

有没有办法在R中对此进行编码?我遇到了麻烦,因为这必须由id完成,因为我不想用dummy 0删除所有观察结果。

3 个答案:

答案 0 :(得分:1)

您可以使用avesubset

subset(dat, as.logical(ave(dummy, id, FUN = any)))

   id name year dummy
1   1 Jane 1990     1
2   1 Jane 1991     1
3   1 Jane 1992     0
4   1 Jane 1993     0
8   3  Jim 1981     1
9   3  Jim 1982     1
10  3  Jim 1983     0

其中dat是数据框的名称。

答案 1 :(得分:1)

使用data.table的选项

library(data.table)
setDT(df)[, if(any(dummy)) .SD, by = id]

答案 2 :(得分:1)

或者你可以只使用%in%进行子集化。

df <- df[df$name %in% df$name[df$dummy > 0],]

其中df是您的数据框

这完全依赖于原始调用,因此应该(a)非常快,(b)不依赖于任何包。