使用R中的多个列创建对象以最终运行t.test

时间:2018-02-10 20:06:02

标签: r

编辑:我相信我找到了一个问题的解决方案,但是我仍然会感谢有人可以向我解释为什么直接在下面的方法可行,而我之前尝试过的方法(在原始问题中进一步概述)不会工作。

average_a<-apply(df[19:38], 2, mean, na.rm=TRUE)
average_c<-apply(df[39:58], 2, mean, na.rm=TRUE)

我正在尝试创建两个包含某些列的平均值的变量,以便最终运行t.test。

A1U_sweet  A2F_dip  A3U_bbq  C1U_sweet  C2F_dip  C3U_bbq
1          2        1        NA         NA       NA
NA         NA       NA       4          1        2
2          4        7        NA         NA       NA

过去,我使用了以下方法。然后我就可以运行t.test比较average_A和average_C。

average_A<-data.frame((mean(A1U_sweet, na.rm = TRUE)), (mean(A2F_dip, na.rm = TRUE)), (mean(A3U_sweet, na.rm = TRUE)))
average_C<-data.frame((mean(C1U_sweet, na.rm = TRUE)), (mean(C2F_dip, na.rm = TRUE)), (mean(C3U_sweet, na.rm = TRUE)))

我最近尝试了以下方法。这样更有效,因为我有很多列,并且无法手动输入它们。编辑:为什么这不起作用?

dfa<-df[19:38]
average_A<-lapply(split.default(dfa, sub("\\d+.*", "", names(dfa))), colMeans, na.rm = TRUE)
dfc<-df[39:58]
average_C<-lapply(split.default(dfc, sub("\\d+.*", "", names(dfc))), colMeans, na.rm = TRUE)

我认为这会给我与之前更长的做法相同的结果。但是,当我尝试运行t.test来比较average_A和average_C时,我得到以下错误:

Error: is.atomic(x) is not TRUE
In addition: Warning message:
In mean.default(x) : argument is not numeric or logical: returning NA

我对这个问题的第一种和第二种方法有什么区别?如何修改第二种方法,以便我可以使用后续对象来运行t.tests等分析?

1 个答案:

答案 0 :(得分:0)

我认为问题可能在于您对数据框进行子集化的方式。

我将您的数据转换为数据框

dfa <- df[,1:3]
average_A<-lapply(split.default(dfa, sub("\\d+.*", "", names(dfa))), colMeans, na.rm = TRUE)
dfc <- df[,4:6]
average_C<-lapply(split.default(dfc, sub("\\d+.*", "", names(dfc))), colMeans, na.rm = TRUE)
t.test(unlist(average_A), unlist(average_C), paired = F)

然后你的解决方案奏效了。但是,您需要在运行t.test之前取消列出sapply()的结果。

lapply()

如果您使用sapply()代替dfa <- df[,1:3] average_A<-sapply(split.default(dfa, sub("\\d+.*", "", names(dfa))), colMeans, na.rm = TRUE) dfc <- df[,4:6] average_C<-sapply(split.default(dfc, sub("\\d+.*", "", names(dfc))), colMeans, na.rm = TRUE) t.test(average_A, average_C, paired = F) ,则无需取消任何内容,因为t.test(sapply(grep("A.*", names(df)), function (i) mean(df[,i], na.rm=T)), sapply(grep("C.*", names(df)), function (i) mean(df[,i], na.rm=T)), paired = F) 会返回向量而不是列表

<div style='display:inline-block;'>NOTE:</div>
<div style='display:inline-block; width:200px;'>
    Here's <div class='embedded'></div> an embedded div and more text
</div>

另外,我知道你没有问,但另一个解决方案是

.embedded {
    width:40px;
    height:40px;
    display:inline-block;
    vertical-align:-15px;
    border:1px solid black;
}