通过 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
我有一个看起来像这样的数据框
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