假设我的结果如下:
df<-data.frame(id=rep(letters[1:4], each=4), stringsAsFactors=FALSE,
test=c(rep(FALSE, 4), rep(c(FALSE, TRUE), 4), rep(TRUE, 4)))
id test
1 a FALSE
2 a FALSE
3 a FALSE
4 a FALSE
5 b FALSE
6 b TRUE
7 b FALSE
8 b TRUE
9 c FALSE
10 c TRUE
11 c FALSE
12 c TRUE
13 d TRUE
14 d TRUE
15 d TRUE
16 d TRUE
我想看到的是每个主题的测试结果是否一致。这样:
id consist
1 a TRUE
2 b FALSE
3 c FALSE
4 d TRUE
在R中实现这一目标的简单方法是什么?
答案 0 :(得分:2)
以下是使用aggregate
的方法:
aggregate(test ~ id, data=df, FUN=function(x) min(x) == max(x))
id test
1 a TRUE
2 b FALSE
3 c FALSE
4 d TRUE
对于每个id,该函数检查测试结果的min是否等于结果的最大值。
第二种方法是使用diff
检查值是否存在差异:
aggregate(test ~ id, data=df, FUN=function(x) max(abs(diff(x))) == 0)
id test
1 a TRUE
2 b FALSE
3 c FALSE
4 d TRUE
这里,取绝对值的最大值来得出差异的大小。
答案 1 :(得分:2)
还可以使用TRUE
和FALSE
组合检查组中是否完全不存在table
或rowSums
rowSums(table(df) == 0)
# a b c d
# 1 0 0 1
或更接近您想要的输出
data.frame(test = rowSums(table(df) == 0) == 1)
# test
# a TRUE
# b FALSE
# c FALSE
# d TRUE
答案 2 :(得分:1)
使用dplyr
包
df %>%group_by(id) %>% summarise(consist=ifelse(var(test)==0,TRUE,FALSE))
感谢@David Arenburg的评论,我们可以通过这样做来简化上面的基础R
data.frame(test=with(df, tapply(test, id, var)) == 0)
答案 3 :(得分:1)
以下是使用data.table
library(data.table)
setDT(df)[, .(consist= all(test)| all(!test)) , by = id]
# id consist
#1: a TRUE
#2: b FALSE
#3: c FALSE
#4: d TRUE
或使用uniqueN
setDT(df)[,.(consist = uniqueN(test)==1) , by = id]