【问题标题】:lapply function to compute means of data frames inside a listlapply 函数计算列表中数据帧的平均值
【发布时间】:2023-03-29 15:50:01
【问题描述】:

我正在尝试使用 lapply 函数计算列表中数据帧的平均值。

df_list <- list(cars, mtcars)
sapply(df_list, mean)

上面的代码似乎不起作用。但是,当我将其更改为:

 df_list <- c(cars, mtcars)
 sapply(df_list, mean)

输出具有两个数据帧的所有变量的平均值。

有没有办法使用第一种方法计算均值。

【问题讨论】:

  • c(cars, mtcars) 用每列的每个元素创建一个列表,而list(cars, mtcars) 用两个数据框创建一个列表。由于mean(mtcars)mean(cars) 导致NA,当然第一个方法是行不通的。你到底想达到什么目标?

标签: r list dataframe sapply


【解决方案1】:

使用purrr 库来实现这个...简单得多:

library(purrr) 
map(df_list, ~map_if(., is.numeric, mean))

如果你想返回一个df,那么:

map_df(df_list, ~map_if(., is.numeric, mean)) 

答案来自这里: why does map_if() not work within a list 信用应该去@Axeman

【讨论】:

    【解决方案2】:

    在基础 R 中,您可以使用 rapply 来计算 data.frames 列表中包含的变量的均值。

    # data
    df_list <- list(cars, mtcars)
    

    最简单的输出是使用两个参数运行rapply,函数和data.frames 列表。函数if(is.numeric(x)) mean(x) 检查变量是否为数值,如果是,则返回平均值。

    # returns a vector of means
    rapply(df_list, function(x) if(is.numeric(x)) mean(x))
    

    这个输出破坏了变量和它们的data.frames之间的关系。如果需要,我们可以返回一个结构中的值,该结构保留原始对象的结构、长度为 2 的嵌套列表以及长度为 2 和 11 的内部列表。

    rapply(df_list, function(x) if(is.numeric(x)) mean(x), how="list")
    

    生成的结构可能比预期的更复杂。根据我的口味,

    lapply(rapply(df_list, function(x) if(is.numeric(x)) mean(x), how="list"), unlist)
    [[1]]
    speed  dist 
    15.40 42.98 
    
    [[2]]
           mpg        cyl       disp         hp       drat         wt       qsec 
     20.090625   6.187500 230.721875 146.687500   3.596563   3.217250  17.848750 
            vs         am       gear       carb 
      0.437500   0.406250   3.687500   2.812500
    

    产生一个很好的平衡,一个长度为 2 的列表,每个列表都包含均值的命名向量。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-06-23
      • 1970-01-01
      • 2021-09-22
      • 2022-01-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多