lapply函数用于计算列表中数据帧的方式

时间:2017-07-29 03:54:54

标签: r list dataframe sapply

我正在尝试使用lapply函数计算列表中数据框的方法。

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

以上代码似乎不起作用。但是,当我把它改为:

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

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

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

2 个答案:

答案 0 :(得分:2)

使用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

答案 1 :(得分:1)

在基数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的列表,每个包含平均值的命名向量。