测试R中每个受试者的多重复结果的一致性

时间:2016-06-30 19:09:16

标签: r

假设我的结果如下:

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中实现这一目标的简单方法是什么?

4 个答案:

答案 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)

还可以使用TRUEFALSE组合检查组中是否完全不存在tablerowSums

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]