您确实应该考虑将您的数据帧绑定到一个大数据帧中,然后您可以在该数据帧上执行拆分-应用-组合样式分析。
首先在一个列表中创建 5 个 data.frames(带有 cols 名称和薪水)来尝试复制您的数据:
dfs <- replicate(5, data.frame(name=sample(letters, 10), salary=runif(10, 50000,100000)), simplify=F)
现在rbind将它们合并为一个大数据框,并用额外的列df.name表示原始数据框
dfs.bound <- do.call(rbind, mapply(cbind, df.name=paste("DF# ", 1:length(dfs)), dfs, SIMPLIFY=F))
str(dfs.bound)
# 'data.frame': 50 obs. of 3 variables:
# $ df.name: Factor w/ 5 levels "DF# 1","DF# 2",..: 1 1 1 1 1 1 1 1 1 1 ...
# $ name : Factor w/ 21 levels "a","g","h","j",..: 5 2 4 10 8 1 9 6 3 7 ...
# $ salary : num 94666 74596 78793 77120 60251 ...
然后 split apply combine(显示三种方法,tapply 只适用于一列,plyr/data.table 适用于许多列):
tapply(dfs.bound$salary, dfs.bound$df.name, mean)
# DF# 1 DF# 2 DF# 3 DF# 4 DF# 5
# 74342.26 68222.44 71881.49 75840.18 63180.07
使用plyr 和data.table,我们可以添加更多列,以及不同的汇总统计信息。
library(plyr)
ddply(dfs.bound, "df.name", summarise, avg.salary=mean(salary), ppl.count=length(name))
# df.name avg.salary ppl.count
# 1 DF# 1 74342.26 10
# 2 DF# 2 68222.44 10
# 3 DF# 3 71881.49 10
# 4 DF# 4 75840.18 10
# 5 DF# 5 63180.07 10
library(data.table)
data.table(dfs.bound)[, list(avg.salary=mean(salary), ppl.count=length(name)), by=df.name]
# df.name avg.salary ppl.count
# 1: DF# 1 74342.26 10
# 2: DF# 2 68222.44 10
# 3: DF# 3 71881.49 10
# 4: DF# 4 75840.18 10
# 5: DF# 5 63180.07 10