R 在data.table中对多列使用t.test

R 在data.table中对多列使用t.test,r,function,data.table,lapply,R,Function,Data.table,Lapply,我正在尝试对data.table中“j”内的多列数据运行t.test。我已经找到了一种有效的方法,但不是很优雅,而且我觉得可能有一种更简洁的方法使用.SDcols,但是没有幸浏览过这里,或者data.table vignette。如果之前有人问过这个问题,我道歉,请给我指出正确的方向 My data.table基本上具有以下格式 DT <- data.table(name = c('a', 'b', 'c', 'a', 'b', 'c'), y = c(

我正在尝试对data.table中“j”内的多列数据运行t.test。我已经找到了一种有效的方法,但不是很优雅,而且我觉得可能有一种更简洁的方法使用.SDcols,但是没有幸浏览过这里,或者data.table vignette。如果之前有人问过这个问题,我道歉,请给我指出正确的方向

My data.table基本上具有以下格式

DT <- data.table(name = c('a', 'b', 'c', 'a', 'b', 'c'), 
                 y = c(rnorm(6, mean = 100, sd = 30)), 
                 z = c(rnorm(6, mean = 10, sd = 3)),
                 group = rep(c('One', 'Two'), 3))
如果我想得到y和z的输出,下面的方法是可行的,但是很笨重而且不雅观。对于我的实际数据,我试图在许多列上这样做,因此键入我想要运行的每个迭代将花费更多的时间

DT[,.(t.test(y~group), t.test(z~group))]
在data.table vignette中,在特定列子集上使用函数是通过

DT[,lapply(.SD, mean), .SDcols = c('y', 'z')]

然而,用t.test替换均值会得到一个样本t.test,而我试图得到一个两样本t.test。我试过:

DT[,lapply(.SD, t.test, formula = .SDcols ~ group, data = DT), .SDcols = c('y', 'z')]

但这给了我y和z之间的比较,而不是y~群和z~群的比较

我已经尝试了几个版本的Lappy,其中包含一个自定义函数,以获得我想要的输出,但我不会让任何人阅读我的失败代码。不用说,我一直无法让它发挥作用

问题: 有没有一种方法可以通过lappy或function,或者我目前不知道的一种方法,让t.test在data.table中的“j”内的多列数据上运行

提前感谢您的帮助,
Chris

将答案的各个部分放在一起,如果需要更好的打印,可以重新排列,将名称放在第一列:

library(data.table)

DT <- data.table(name = c('a', 'b', 'c', 'a', 'b', 'c'), 
                 y = c(rnorm(6, mean = 100, sd = 30)), 
                 z = c(rnorm(6, mean = 10, sd = 3)),
                 group = rep(c('One', 'Two'), 3))

 result <- 
   DT[,lapply(.SD, function(x) t.test(x ~ group)), .SDcols = y:z][
   ,ttname:=names(t.test(1:5))][  # add names
   ,.(ttname,y,z)]    # put names in first column   

 result

#         ttname                       y                       z
# 1:   statistic               0.1391646               0.1295093
# 2:   parameter                3.468876                3.559917
# 3:     p.value               0.8970165               0.9039359
# 4:    conf.int     -99.61786,109.47358     -8.209637, 8.972439
# 5:    estimate       110.7286,105.8008       11.15414,10.77274
# 6:  null.value                       0                       0
# 7:      stderr                35.41031                 2.94497
# 8: alternative               two.sided               two.sided
# 9:      method Welch Two Sample t-test Welch Two Sample t-test
# 10:   data.name              x by group              x by group

如果需要更好的打印,请将答案的各个部分放在一起,并重新排列,将名称放在第一列:

library(data.table)

DT <- data.table(name = c('a', 'b', 'c', 'a', 'b', 'c'), 
                 y = c(rnorm(6, mean = 100, sd = 30)), 
                 z = c(rnorm(6, mean = 10, sd = 3)),
                 group = rep(c('One', 'Two'), 3))

 result <- 
   DT[,lapply(.SD, function(x) t.test(x ~ group)), .SDcols = y:z][
   ,ttname:=names(t.test(1:5))][  # add names
   ,.(ttname,y,z)]    # put names in first column   

 result

#         ttname                       y                       z
# 1:   statistic               0.1391646               0.1295093
# 2:   parameter                3.468876                3.559917
# 3:     p.value               0.8970165               0.9039359
# 4:    conf.int     -99.61786,109.47358     -8.209637, 8.972439
# 5:    estimate       110.7286,105.8008       11.15414,10.77274
# 6:  null.value                       0                       0
# 7:      stderr                35.41031                 2.94497
# 8: alternative               two.sided               two.sided
# 9:      method Welch Two Sample t-test Welch Two Sample t-test
# 10:   data.name              x by group              x by group

类似的东西应该可以工作:DT[,lappy.SD,functionx t.testx~group,.SDcols=y:z]。在这里,您设置了一个匿名labmda函数,该函数在Lappy退出后消失。这非常有效,我知道pvalue将被抛出到一个一致的位置,它在列表中[3],因此我可以使用DT[youranswer][3]将其拉出。但是,您知道是否有办法保留行名或添加一个输出列,其中包含ttest输出中的名称吗?如果不担心的话,这已经很有帮助了!如果您通过@lmo将代码的输出分配给result,那么您可以通过使用result[,ttname:=namest.test1:5]从一个伪t.test中提取名称来为其添加名称。谢谢@DaveTurek,您的建议为我提供了一种汇总统计表,可以对其进行索引以提取p.value,这正是我想要的。谢谢你的帮助。类似的东西应该可以工作:DT[,lappy.SD,functionx t.testx~group,.SDcols=y:z]。在这里,您设置了一个匿名labmda函数,该函数在Lappy退出后消失。这非常有效,我知道pvalue将被抛出到一个一致的位置,它在列表中[3],因此我可以使用DT[youranswer][3]将其拉出。但是,您知道是否有办法保留行名或添加一个输出列,其中包含ttest输出中的名称吗?如果不担心的话,这已经很有帮助了!如果您通过@lmo将代码的输出分配给result,那么您可以通过使用result[,ttname:=namest.test1:5]从一个伪t.test中提取名称来为其添加名称。谢谢@DaveTurek,您的建议为我提供了一种汇总统计表,可以对其进行索引以提取p.value,这正是我想要的。谢谢你的帮助。