【问题标题】:Computing average of columns of a list of dataframes in R?计算R中数据框列表的列的平均值?
【发布时间】:2020-07-06 11:45:27
【问题描述】:

我有一个如下所示的数据框列表:

$central_nervous_system
     DepMap_ID                Lineage       ABCA2
133 ACH-000025 central_nervous_system  0.06953841
134 ACH-000036 central_nervous_system -0.20757324
135 ACH-000040 central_nervous_system -0.07189173
          ABCA3       ABCA5        ABCB9      ABCC10
133 -0.20215981  0.02591981 -0.124328522 -0.19439091
134 -0.16144270  0.08592305 -0.101500474 -0.01984359
135 -0.06166222 -0.26031989  0.009193998 -0.33360141

总共有 26 个数据帧。我想生成另一个数据框列表,或者一个表或一个列表,其中包含除前两个之外的所有列的平均值(因为它们不是数字)。到目前为止,我的方法是:

lineage_avged <- lapply(x,colMeans(x[3:ncol(lineage_data)], na.rm = TRUE))

但它不起作用,我假设因为 lapply 不应该在这里使用。

【问题讨论】:

  • x2 &lt;- lapply(x, '[', -(1:2)); sapply(x2, colMeans, na.rm=TRUE)

标签: r dataframe lapply


【解决方案1】:

示例数据:

x <- list(mtcars,mtcars)

代码:

sapply(x, function(df) apply(df[,-(1:2)], 2, mean))

#or use: sapply(x, function(df) colMeans(df[,-(1:2)]))

输出:

           [,1]       [,2]
disp 230.721875 230.721875
hp   146.687500 146.687500
drat   3.596563   3.596563
wt     3.217250   3.217250
qsec  17.848750  17.848750
vs     0.437500   0.437500
am     0.406250   0.406250
gear   3.687500   3.687500
carb   2.812500   2.812500

【讨论】:

    【解决方案2】:

    您可以尝试此解决方案。我还提供了一个包含其他数据的示例。

    lineage_avged <- lapply(YourList,function(x) colMeans(x[,-c(1,2)], na.rm = TRUE))
    

    示例

    #Create list
    List <- split(iris,iris$Species)
    #Function
    lineage_avged <- lapply(List,function(x) colMeans(x[,-5], na.rm = TRUE))
    
    $setosa
    Sepal.Length  Sepal.Width Petal.Length  Petal.Width 
           5.006        3.428        1.462        0.246 
    
    $versicolor
    Sepal.Length  Sepal.Width Petal.Length  Petal.Width 
           5.936        2.770        4.260        1.326 
    
    $virginica
    Sepal.Length  Sepal.Width Petal.Length  Petal.Width 
           6.588        2.974        5.552        2.026 
    

    【讨论】:

      【解决方案3】:

      为什么不使用apply?

      library(tidyverse)
      
      a <-tribble(~DepMap_ID,                ~Lineage,       ~BCA2,
       "ACH-000025", "central_nervous_system",  0.06953841,
       "ACH-000036", "central_nervous_system", -0.20757324,
       "ACH-000040", "central_nervous_system", -0.07189173)
      b <-tribble( ~ABCA3,      ~ABCA5,       ~ABCB9 ,     ~ABCC10,
       -0.20215981,  0.02591981, -0.124328522, -0.19439091,
       -0.16144270,  0.08592305, -0.101500474, -0.01984359,
       -0.06166222, -0.26031989,  0.009193998, -0.33360141)
      
      df <- cbind(a,b)
      
      get_mean <- function(x){
         apply(x[,-c(1,2)], 2, mean, na.rm=T)
      }
      

      然后将其应用于您的所有列表:

      lapply(data, get_mean)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-04-02
        • 2017-12-04
        • 2016-03-03
        • 2020-09-10
        • 2014-03-29
        • 2021-11-25
        相关资源
        最近更新 更多