我有一个长格式不平衡的纵向数据。我想排除所有不包含完整信息的案例。我指的是所有不重复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
任何帮助?
答案 0 :(得分:5)
假设您的变量名称为V1
,V2
...等等,这里有一种方法:
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]])))
split
将data.frame
向上打破第一列,然后Filter
删除没有8行的子组。最后,do.call(rbind, ...)
将剩余的子组折叠回单个data.frame
。
如果temp
的第一列是character
(而不是factor
,您可以使用str(temp)
进行验证)并且这些行按子组排序,那么您也可以做:
with(rle(temp[[1]]), temp[rep(lengths==8, times=lengths), ])