如何排除R中不重复X次的情况?

时间:2012-12-13 18:26:03

标签: r database-design

我有一个长格式不平衡的纵向数据。我想排除所有不包含完整信息的案例。我指的是所有不重复8次的情况。有人可以帮我找到解决方案吗?

下面一个例子:我有三个科目{A,B和C}。我有8个A和B的信息,但只有2个用于C.如何根据少于8次重复测量的信息删除存在C的行?

temp = scan()
A 1 1 1 0
A 1 1 0 1
A 1 0 0 0
A 1 1 1 1
A 0 1 0 0
A 1 1 1 0
A 1 1 0 1
A 1 0 0 0
B 1 1 1 0
B 1 1 0 1
B 1 0 0 0
B 1 1 1 1
B 0 1 0 0
B 1 1 1 0
B 1 1 0 1
B 1 0 0 0
C 1 1 1 1
C 0 1 0 0

任何帮助?

2 个答案:

答案 0 :(得分:5)

假设您的变量名称为V1V2 ...等等,这里有一种方法:

temp[temp$V1 %in% names(which(table(temp$V1) == 8)), ]

table(temp$V1) == 8匹配V1列中恰好有8个案例的值。 names(which(...部分创建了一个我们可以使用%in%匹配的基本字符向量。

另一个:

temp[ave(as.character(temp$V1), temp$V1, FUN = length) == "8", ]

答案 1 :(得分:1)

这是另一种方法:

temp <- read.table(text="
A 1 1 1 0
A 1 1 0 1
A 1 0 0 0
A 1 1 1 1
A 0 1 0 0
A 1 1 1 0
A 1 1 0 1
A 1 0 0 0
B 1 1 1 0
B 1 1 0 1
B 1 0 0 0
B 1 1 1 1
B 0 1 0 0
B 1 1 1 0
B 1 1 0 1
B 1 0 0 0
C 1 1 1 1
C 0 1 0 0", header=FALSE)

do.call(rbind, 
        Filter(function(subgroup) nrow(subgroup) == 8, 
               split(temp, temp[[1]])))

splitdata.frame向上打破第一列,然后Filter删除没有8行的子组。最后,do.call(rbind, ...)将剩余的子组折叠回单个data.frame

如果temp的第一列是character(而不是factor,您可以使用str(temp)进行验证)并且这些行按子组排序,那么您也可以做:

with(rle(temp[[1]]), temp[rep(lengths==8, times=lengths), ])