我有一个看起来像这样的数据框
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(最上面一行)是在单元格中显示的人数,即该年龄段和人数的平均工作数。
我认为它与聚合有关,但在任何网站上都找不到与此类似的内容。
答案 0 :(得分:4)
以下是使用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单元格中的平均作业数。 fill设置为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")))
答案 1 :(得分:3)
假设df是你的data.frame,那么你可以使用 BaseR 使用具有均值函数的聚合,但我认为{I}建议的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