【发布时间】:2020-12-10 20:21:52
【问题描述】:
我已经在这工作了几天,似乎无法让它发挥作用。我有一个数值数据框,我正在尝试对多列的所有行执行 t.test。我觉得我在这里遗漏了一些非常基本的东西。
df1 = data.frame(a1 = rnorm(10, 2, 1),
a2 = rnorm(10, 3, 1),
a3 = rnorm(10, 1, 1.5),
b1 = rnorm(10, 4, 2),
b2 = rnorm(10, 2.5, 4),
b3 = rnorm(10, 3, 3.5),
c1 = rnorm(10, 7, 2.0),
c2 = rnorm(10, 4, 9),
c3 = rnorm(10, 5, 5))
下面我确定要比较哪些列集。例如,我想将所有以 a 开头的列与所有以 b 开头的列以及所有以 a 到 c 开头的列进行比较。我这样做是因为我不需要为每次比较创建一个新变量。
set1 = c("a", "a")
set2 = c("b", "c")
然后我从 df1 中提取确切的列名并将它们放入一个列表中
g1 = lapply(set1, function(x) grep(x, names(df1), value=T, fixed=T))
g2 = lapply(set2, function(x) grep(x, names(df1), value=T, fixed=T))
然后我尝试映射函数。想法是 R 应该使用 a 与 b 的比较值和 a 与 c 的比较值来计算数据帧每一行的 p.value。
test = map2(g1, g2, function(x,y){t_test = apply(df1, 1, function(z) {t.test(z[g1[[x]]], z[g2[[y]]], alternative = "two.sided", var.equal = T)$p.value}) })
现在,如果我选择完全不循环,这可以正常工作。
t_test = apply(df1, 1, function(z) {t.test(z[g1[[1]]], z[g2[[1]]], alternative = "two.sided", var.equal = T)$p.value})
非常感谢任何建议或帮助。
【问题讨论】:
标签: r