1

我有一个长格式的不平衡纵向数据。我想排除所有不包含完整信息的案例。我的意思是所有不重复 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

有什么帮助吗?

4

2 回答 2

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", ]
于 2012-12-13T18:37:46.567 回答
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.

如果 的第一列tempcharacter(而不是factor,您可以使用 验证str(temp))并且行按子组排序,您还可以执行以下操作:

with(rle(temp[[1]]), temp[rep(lengths==8, times=lengths), ])
于 2012-12-13T18:40:19.550 回答