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”内的多列数据?
预先感谢您的帮助,克里斯
将答案的各个部分放在一起并重新排列以将名称放在第一列中(如果需要更好的打印):
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)