R中如何对data.table对象的每行应用t.test函数?
问题分析与解决
为什么原代码得到的pval全部相同
你当前的代码DT[,pval:=t.test(A,B)$p.value]中,t.test(A,B)是对整个A列和B列的所有数据执行一次t检验(默认是独立样本t检验),只会返回一个p值,随后这个值被赋值给pval列的所有行,因此所有行的pval完全相同。
逐行计算的前提与实现
首先需要明确:如果你的A和B列是常规数值列(每行仅一个数值),逐行执行t.test是不可行的——t检验需要至少两个样本才能计算方差和统计量,单对数值没有足够的信息完成检验。
如果你的实际需求是以下两种情况,可以对应处理:
情况1:每行的A、B是包含多组观测的列表列
若你的data.table中,A和B是列表类型,每行存储一组待检验的观测数据,可以通过by=.I按行分组执行t.test:
# 构造示例数据(每行A、B各含5个观测) DT <- data.table( A = list(rnorm(5), rnorm(5), rnorm(5)), B = list(rnorm(5, mean=1), rnorm(5, mean=0), rnorm(5, mean=2)) ) # 逐行计算t检验的p值 DT[, pval := t.test(unlist(A), unlist(B))$p.value, by = .I]
情况2:将每行A、B视为配对样本,检验整体差异
若你想做配对t检验(即认为每行的A和B是配对的观测,检验两列整体是否存在差异),需要给t.test添加paired=TRUE参数,此时pval列的所有行都是该配对检验的结果p值(这是合理的,因为整个检验仅产生一个p值):
DT <- data.table(A=rnorm(30,0,1),B=rnorm(30,0,5)) DT[, pval := t.test(A, B, paired=TRUE)$p.value]
内容的提问来源于stack exchange,提问作者user321627
相关产品推荐
相关产品推荐

