我正在尝试对我的分组因子的所有组合进行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
列中的值?
答案 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
的通话中使用sapply
,sapply
将执行所有测试,直至结束。通常,当生成错误时,代码将停止。使用此方法,它仍然可以继续工作,并将吐出预定义的默认值而不是错误消息。使用此方法,您将能够查看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