【问题标题】:using t.test within data.table on multiple columns在多列的 data.table 中使用 t.test
【发布时间】: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.testresult[,ttname:=names(t.test(1:5))] 中提取名称来为其添加名称
  • 感谢@DaveTurek,您的建议为我提供了一种汇总统计表,可以对其进行索引以提取 p.values,这正是我想要的。感谢您的帮助。

标签: r function data.table lapply


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2014-12-02
    • 1970-01-01
    • 2012-07-25
    • 1970-01-01
    • 2016-11-01
    • 2014-04-27
    • 2017-04-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多