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等分析?
答案 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;
}