【问题标题】:Finding means and medians across data frames in r在 r 中查找跨数据帧的均值和中位数
【发布时间】:2023-03-25 06:48:01
【问题描述】:

我有几个数据框,abcd,每个都有相同的列名。我想找到这些数据框的平均值和中位数。也就是说,构造与ab等大小相同的新meanmedian数据帧。

我可以使用几个 for 循环,但我敢打赌,使用 R 内置函数可以更快地做到这一点。

【问题讨论】:

    标签: r functional-programming


    【解决方案1】:

    按照 Josh Ulrich 的回答,怎么样

    library(abind)
    apply(abind(a,b,c,d,along=3),c(1,2),median)
    

    ? (在适当的切片上使用rowMeans 仍然会比applying mean 快​​...如果您真的需要速度,我认为Biobase(Bioconductor)包中有一个rowMedians?)

    【讨论】:

      【解决方案2】:

      我不确定 JD 的答案是否完全符合您的要求,因为生成的对象与 ab 等的尺寸不同。

      不过,将 data.frames 放入列表是一个好的开始。然后您可以将每一列子集到一个新列表中,cbind 将该列表放入一个矩阵中,并在其行上使用 apply

      a <- data.frame(rnorm(10), runif(10))
      b <- data.frame(rnorm(10), runif(10))
      c <- data.frame(rnorm(10), runif(10))
      d <- data.frame(rnorm(10), runif(10))
      myList <- list(a,b,c,d)
      sapply(1:ncol(a), function(j) {  # median
        apply(do.call(cbind,lapply(myList,`[`,,j)), 1, median)
      })
      sapply(1:ncol(a), function(j) {  # mean
        apply(do.call(cbind,lapply(myList,`[`,,j)), 1, mean)
      })
      sapply(1:ncol(a), function(j) {  # faster mean
        rowMeans(do.call(cbind,lapply(myList,`[`,,j)))
      })
      

      【讨论】:

        【解决方案3】:

        你可以将你的数据框串成一个数据框列表,然后使用lapply(myList, mean, ...)

        【讨论】:

        • 如果你的意思是lapply(c(a, b), mean),那是不对的。这给了我每列的平均值,而不是跨数据框。
        • ohhhhh...我没有意识到你想要它们全部结合在一起。
        猜你喜欢
        • 2022-12-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-02-24
        • 2021-01-26
        相关资源
        最近更新 更多