3

我想在 R 中对我的数据执行两个样本 t 检验。给定两个高维数据帧,我需要以某种方式遍历所有行的匹配列(标题中的字符串 colnames())并执行测试每列对 - 分别来自 df1 和 df2。问题是数据帧中的列顺序不正确,即 df1 中的 col1 与 df2 中的 col1 不匹配,并且 df2 具有 df1 中不存在的其他列。我从未将 R 用于此类任务,我想知道是否有一种快速方便的解决方案可以在 t 检验的数据框中找到匹配的列对。

我考虑过 for 循环,但我认为这对于大型数据帧来说效率很低。

预先感谢您的任何帮助。

*EDITED--------两个小的示例数据框,df1 和 df2--------------------------------

****df1****

"Row\Column"    "A2"    "A1"    "A4"    "A3"
"id_1"           10      20      0       40
"id_2"           5       15      25      35
"id_3"           8       0       12      16
"id_4"           17      25      0       40

****df2****

"Row\Column"    "A3"    "A8"    "A5"    "A6"    "A1"    "A7"    "A4"    "A2"
"id_1"           0       2       0       4       0       1       2       3
"id_2"           1       5       8       3       4       5       6       7
"id_3"           2       10      6       9       8       9       10      11
"id_4"           7       2       10      2       55      0       0       0
"id_5"           0       1       0       0       9       1       3       4
"id_6"           8       0       1       2       7       2       3       0  

匹配列只不过是 df1 中的列名与 df2 中的列名匹配。例如 df1 和 df2 中的两个匹配列是例如“A1”和“A1”,“A2”和“A2”......你明白了......

4

2 回答 2

4

mapply是您正在寻找的功能。
如果您data.frame的 s 的列匹配,您可以简单地使用

mapply(t.test, df1, df2)

但是,由于它们不这样做,因此您需要以某种方式确定哪一列df1df2. 幸运的是,其中的索引选项R很聪明,如果您输入列名的向量(集合),您将按给定顺序取回这些列。这让生活变得轻松。

# find the matching names
## this will give you those names in df1 that are also in df2
## and *only* such names (ie, strict intersect)
matchingNames <- names(df1)[names(df1) %in% names(df2)]

注意它matchingNames有一些顺序现在看看当你使用matchingNames向量作为 df1 和 df2 的每个列的索引时会发生什么(还要注意列顺序)

df1[, matchingNames]
df2[, matchingNames]
matchingNames    

因此,我们现在有两个具有正确匹配列的 data.frames,我们可以使用它们来mapply覆盖。

## mapply will apply a function to each data.frame, one pair of columns at a time

## The first argument to `mapply` is your function, in this example, `t.test`
## The second and third arguments are the data.frames (or lists) to simultaneously iterate over
mapply(t.test, df1[, matchingNames], df2[, matchingNames])
于 2013-04-07T17:13:13.207 回答
0

如果没有可重复的例子,很难给你一个好的答案。您还需要定义列是什么意思matching

这是 2 个 data.frames 的示例,它们有一些共同的列名。

df1 <- matrix(sample(1:100,5*5,rep=TRUE),ncol=5,nrow=5)
df2 <- matrix(sample(1:100,5*8,rep=TRUE),ncol=8,nrow=5)
colnames(df1) <- letters[6:10]
colnames(df2) <- rev(letters[1:8])

然后我定义一个 , 的包装器t.test,例如将输出限制为 p 值和自由度。

f <- function(x,y){
  test <- t.test(x,y)
  data.frame(df   = test$parameter,
                    pval = test$p.value)
}

然后使用sapply我迭代我使用的常见列intersect

sapply(intersect(colnames(df1),colnames(df2)), 
                 function(x) f(df1[,x], df2[,x]))

     f         g         h        
df   7.85416   6.800044  7.508915 
pval 0.5792354 0.2225824 0.4392895
于 2013-04-07T17:20:31.397 回答