我正在尝试使用lapply函数计算列表中数据框的方法。
df_list <- list(cars, mtcars)
sapply(df_list, mean)
以上代码似乎不起作用。但是,当我把它改为:
df_list <- c(cars, mtcars)
sapply(df_list, mean)
输出具有两个数据帧的所有变量的平均值。
有没有办法用第一种方法计算均值。
答案 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的列表,每个包含平均值的命名向量。