通过 2 个变量聚合一个值

Aggregate a value by 2 variables

我有一个看起来像这样的数据框

AgeBracket    No of People     No of Jobs
18-25               2               5
18-25               2               2
26-34               4               6
35-44               4               0
26-34               2               3 
35-44               1               7
45-54               3               2

据此我想汇总数据,如下所示:

AgeBracket     1Person    2People    3People    4People
18-25             0          3.5        0          0
26-34             0           3         0          6
35-44             7           0         0          0
45-54             0           0         2          0

因此,沿 Y 轴的是年龄段,沿 X 轴(顶行)是人数,而在单元格中显示的是该年龄段的平均工作数量和人数。

我认为这与聚合有关,但在任何网站上都找不到与此类似的东西。

这是一个使用 dcast 的 data.table 方法。

library(data.table)

setnames(dcast(df, AgeBracket ~ People, value.var="Jobs", fun.aggregate=mean, fill=0),
         c("AgeBracket", paste0(sort(unique(df$People)), "Person")))[]

在这里,dcast 重塑宽,将人作为单独的变量。 fun.aggregate 用于计算 ageBracket-person 单元格中的平均工作数量。填充设置为 0。

setnames 用于重命名变量,默认为整数值。最后的[]用于打印结果。

   AgeBracket 1Person 2Person 3Person 4Person
1:      18-25       0     3.5       0       0
2:      26-34       0     3.0       0       6
3:      35-44       7     0.0       0       0
4:      45-54       0     0.0       2       0

这可以分成两行,这样可能更具可读性。

# reshape wide and calculate means
df.wide <- dcast(df, AgeBracket ~ People, value.var="Jobs", fun.aggregate=mean, fill=0)
# rename variables
setnames(df.wide, c("AgeBracket", paste0(names(df.wide)[-1], "Person")))

假设 df 是你的 data.frame 那么你可以使用 BaseR 将聚合与均值函数一起使用,但我认为 data.table 方法更快我:

agg <- aggregate(No.of.Jobs ~ AgeBracket + No.of.People,data=df,mean)
fin <- reshape2::dcast(agg,AgeBracket ~ No.of.People)
fin[is.na(fin)] <- 0
names(fin) <- c("AgeBracket",paste0("People",1:4))

正如@Imo 所建议的,单行代码可能是这样的:

reshape2::dcast(df, AgeBracket ~ No.of.People, value.var="No.of.Jobs", fun.aggregate=mean, fill=0)

之后我们只需要重命名列即可。

输出:

 AgeBracket People1 People2 People3 People4
1      18-25       0     3.5       0       0
2      26-34       0     3.0       0       6
3      35-44       7     0.0       0       0
4      45-54       0     0.0       2       0