【问题标题】:Apply function to each cell across multiple dataframes in R将函数应用于 R 中跨多个数据帧的每个单元格
【发布时间】:2016-10-28 11:33:23
【问题描述】:

假设我有 N 个相同(行数和列数相同)的数据框:

set.seed(2)
df1 <- data.frame(replicate(100,rnorm(100)))
df2 <- data.frame(replicate(100,rnorm(100)))
dfN <- data.frame(replicate(100,rnorm(100)))

我想在 N 个数据帧的每个“单元”中应用一个函数(在本例中为 t.test()),以便返回一个单独的数据帧,其中包含执行的每个单元测试的 t 值.本质上,我想获取每个数据帧的第一个单元格,

one <- df1[1,1]
two <- df2[1,1]
Nth <- dfN[1,1]

在这些单元格上执行t.test()

first.cell.each <- cbind.data.frame(one,two,Nth)
t.test(first.cell.each, mu=0)

并在所有单元格中重复此操作(在本例中为 10000)。

编辑:澄清

【问题讨论】:

  • @ZheyuanLi,对不起,我应该更清楚。行数和列数相同。
  • 您使用了错误的数据结构。将 data.frames 组合成一个数组并使用 apply。
  • 您现在可以使用新的tidyr 包来组合多个数据帧并处理它们的数据。见blog.rstudio.org/2014/07/22/introducing-tidyr

标签: r dataframe


【解决方案1】:

我们可以创建一个matrix 来存储p.value 的输出t.test 具有与各个数据集相同的维度。然后,遍历行和列的序列,从每个数据集中提取元素,连接并执行t.test 并将输出分配给“res”的相同行/列索引。

res <- matrix(, ncol=100, nrow=100)
for(i in seq_len(nrow(df1))){
 for(j in seq_len(ncol(df1))){
  res[i,j] <- t.test(c(df1[i,j], df2[i,j], dfN[i,j]), mu = 0)$p.value

 }}

我的代码还返回一个 100*100 矩阵

str(res)
#num [1:100, 1:100] 0.629 0.5 0.131 0.769 0.348 ...

如果有很多数据集,我们可以将其放在list 中,然后将其转换为array 并使用t.test 执行apply

lst <-  mget(paste0("df", c(1, 2, "N")))
ar1 <- array(unlist(lst), dim = c(dim(df1), length(lst)))
res2 <-  apply(aperm(ar1, c(3, 1, 2)), c(2,3), FUN = function(x) t.test(x, mu = 0)$p.value) 
str(res2)
# num [1:100, 1:100] 0.629 0.5 0.131 0.769 0.348 ...

【讨论】:

    【解决方案2】:

    假设您将所有数据框保存在列表datlst 中,这样就可以了

    z <- matrix(tapply(unlist(datlst, use.names = FALSE),
                       rep(gl(prod(dim(datlst[[1]])), 1), length(datlst)),
                       FUN = function (u) t.test(u, mu = 0)$p.value),
                nrow = nrow(datlst[[1]]))
    

    使用您的示例数据框datlst &lt;- list(df1, df2, dfN),我的代码成功地为您返回了一个 100 * 100 矩阵:

    str(z)
    # num [1:100, 1:100] 0.629 0.5 0.131 0.769 0.348 ...
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-04-02
      • 1970-01-01
      • 2014-12-17
      • 2017-01-21
      • 2015-09-13
      • 2017-07-11
      • 1970-01-01
      • 2022-07-13
      相关资源
      最近更新 更多