在多列的 data.table 中使用 t.test

Chr*_*s R 3 r function lapply data.table

我正在尝试对 data.table 中“j”内的多列数据运行 t.test()。我找到了一种可行的方法,但不是很优雅,我觉得可能有一种使用 .SDcols 的更简洁的方法,但没有运气浏览这里或 data.table 小插图。如果之前有人问过这个问题,我深表歉意,并请指出正确的方向。

我的 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))
Run Code Online (Sandbox Code Playgroud)

当我想运行 t.test 来比较第一组和第二组中的 y 值时,这非常简单:

DT[,t.test(y~group)]
Run Code Online (Sandbox Code Playgroud)

如果我想获得 y 和 z 的输出,以下方法可以工作,但笨重且不优雅。对于我的实际数据,我尝试在许多列上执行此操作,因此输入我想要运行的每个迭代会花费更多时间。

DT[,.(t.test(y~group), t.test(z~group))]
Run Code Online (Sandbox Code Playgroud)

在 data.table 插图中,对特定列子集使用函数是通过以下方式实现的

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

Run Code Online (Sandbox Code Playgroud)

然而,用 t.test 替换平均值会产生一个样本 t.test,而我正在尝试获得两个样本 t.test。我试过了:

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

Run Code Online (Sandbox Code Playgroud)

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

我已经尝试了几个版本的 lapply 和自定义函数来获得我想要的输出,但我不会让任何人阅读我的不成功代码。不用说,我一直无法让它发挥作用。

问题: 有没有办法通过 lapply() 或 function() 或目前我不知道的方式,让 t.test 运行 data.table 中“j”内的多列数据?

预先感谢您的帮助,克里斯

Dav*_*rek 6

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

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
Run Code Online (Sandbox Code Playgroud)