R 在data.table中对多列使用t.test
我正在尝试对data.table中“j”内的多列数据运行t.test。我已经找到了一种有效的方法,但不是很优雅,而且我觉得可能有一种更简洁的方法使用.SDcols,但是没有幸浏览过这里,或者data.table vignette。如果之前有人问过这个问题,我道歉,请给我指出正确的方向 My data.table基本上具有以下格式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(
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,这正是我想要的。谢谢你的帮助。