t。通过子集化首先对分组因子的所有组合进行测试

时间:2016-05-28 16:13:41

标签: r

我正在尝试对我的分组因子的所有组合进行t.test,首先只根据另一列的选择标准选择和分组数据。

我的数据结构: STR(MYDATA)

'data.frame':   240 obs. of  6 variables:
 $ Group   : chr  "G1" "G1" "G1" "G1" ...
 $ Category: chr  "Cat1" "Cat1" "Cat1" "Cat1" ...
 $ Subgroup: chr  "SG1" "SG1" "SG1" "SG1" ...
 $ Score   : num  0.156 0.131 0.092 0.319 0.179 ...
 $ SD      : num  0.0768 0.0768 0.0768 0.0768 0.0768 ...
 $ SE      : num  0.0172 0.0172 0.0172 0.0172 0.0172 ...

我在Group列中有三个组: G1 G2 G3
我在Category列中有四个类别: Cat1 Cat2 Cat3 Cat4
我有12个小组: SG1 SG2 ,直到 SG12

目前,我首先通过基于其组ID对数据进行子集化来创建子组名称的所有组合的列表,因此在此示例中为G1和G3:

combinations <- combn(unique(mydata[mydata$Group %in% c("G1", "G3"),]$Subgroup),2, simplify = FALSE)

然后对每个组合进行t.test,referring to the answer here

results <- lapply(seq_along(combinations), function (n) {
  mydatatemp <- mydata[rownames(mydata$Subgroup) %in% unlist(combinations[n]),]
  result <- t.test(mydatatemp[,1], mydatatemp[,2], alternative="two.sided", var.equal=TRUE)
  return(result)})
results

我得到的错误如下:

Error in t.test.default(mydatatemp[, 1], mydatatemp[, 2], alternative = "two.sided",  : 
  not enough 'x' observations In addition: Warning message:
In mean.default(x) : argument is not numeric or logical: returning NA

有更有效的方法吗?否则,如何更正此错误?

更新

实际上问题是如何调用t.test公式中Score列中的值?

2 个答案:

答案 0 :(得分:2)

要解决评论中的讨论:如果问题出在其中一个子组中,那么以下内容可能有助于确定它是哪一个:

首先,让我们重新创建错误:

smalln <- data.frame(a=1, b=2)
t.test(smalln$a, smalln$b)
> Error in t.test.default(smalln$a, smalln$b) : not enough 'x' observations

好的,我们可以重新创建错误。现在,让它在中断其他调用(例如执行它的sapply调用)之前捕获它:

failproof.t <- failwith(default="I need coffee", t.test, quiet = T)
failproof.t(smalln$a, smalln$b)
[1] "I need coffee"

如果您在failproof.t的通话中使用sapplysapply将执行所有测试,直至结束。通常,当生成错误时,代码将停止。使用此方法,它仍然可以继续工作,并将吐出预定义的默认值而不是错误消息。使用此方法,您将能够查看results列表以查看错误发生的组合。

答案 1 :(得分:1)

您的代码应如下所示:

results <- lapply(seq_along(combinations), function (n) {
  mydatatemp <- mydata[with(mydata, Subgroup %in% unlist(combinations2[n]) & Group %in% c("G1", "G3")),]
  result <- t.test(mydatatemp[
                   mydatatemp$Subgroup == sapply(combinations[n], "[",1),4],
                   mydatatemp[mydatatemp$Subgroup == sapply(combinations[n], "[", 2),4],
                   alternative="two.sided", var.equal=TRUE)
             return(result)})
results