我的面板数据如下所示:
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
删除所有观察结果。
答案 0 :(得分:1)
您可以使用ave
和subset
:
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)不依赖于任何包。