【发布时间】:2020-09-04 10:11:20
【问题描述】:
我正在尝试对 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))
当我想运行 t.test 比较第一组和第二组中 y 的值时,这非常简单:
DT[,t.test(y~group)]
如果我想获得 y 和 z 的输出,则以下工作,但笨重且不雅。使用我的实际数据,我试图在许多列上执行此操作,因此键入我想要运行的每个迭代会更耗时。
DT[,.(t.test(y~group), t.test(z~group))]
在 data.table 小插图中,在特定的列子集上使用函数是通过
实现的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~group 和 z~group 的比较。
我已经使用自定义函数尝试了多个版本的 lapply 以获得我想要的输出,但我不会让任何人阅读我的不成功代码墙。不用说,我一直无法让它发挥作用。
问题: 有没有办法通过 lapply() 或 function() 或我目前不知道的方式,让 t.test 运行 data.table 中“j”内的多列数据?
提前感谢您的帮助, 克里斯
【问题讨论】:
-
这样的东西应该可以工作:
DT[,lapply(.SD, function(x) t.test(x ~ group)), .SDcols = y:z]。在这里,您设置了一个匿名 (labmda) 函数,该函数在lapply退出后消失。 -
效果很好,我知道 pvalue 会被扔到一个一致的位置,它在列表中的 [3],所以我可以用 DT[youranswer][3] 将其取出。但是您知道是否有办法保留行名或添加带有来自 ttest 输出的名称的输出列?如果不担心,这已经很有帮助了!
-
如果您将@lmo 的代码输出分配给
result,您可以通过从虚拟t.test和result[,ttname:=names(t.test(1:5))]中提取名称来为其添加名称 -
感谢@DaveTurek,您的建议为我提供了一种汇总统计表,可以对其进行索引以提取 p.values,这正是我想要的。感谢您的帮助。
标签: r function data.table lapply