R 用2个变量聚合一个值
我有一个看起来像这样的数据框R 用2个变量聚合一个值,r,variables,aggregate,multiple-columns,R,Variables,Aggregate,Multiple Columns,我有一个看起来像这样的数据框 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
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用于计算年龄组人员单元格中的平均工作数。填充设置为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.wide假设df是您的data.frame,那么您可以使用BaseR使用平均函数进行聚合,但我认为数据。按照Imo的建议,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))
我们需要在那之后重命名这些列
输出:
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
dcast需要哪个软件包/库?对不起。补充说,此版本的dcast
来自data.table
。dcast
函数来自reforme2
可能也可以在没有任何更改的情况下工作,但是setnames
是一个用于重命名变量的data.table
函数。请注意,dcast
的语法与data是相同的。在本例中,table
(v1.10.4)和restrape2
(v1.4.1)包可以将前三行折叠到我的第一行,如restrape2::dcast(df,AgeBracket~People,value.var=“Jobs”,fun.aggregate=mean,fill=0)
。还有一个是我的。@Imo非常感谢专家们的意见,我认为data.table解决方案要好得多,我知道你想表达的是什么,我只是想让解决方案简单一些。当然。除了速度之外,data.table
的第二个优点是它可以一次转换多个变量,而ch在更广泛的数据集中非常方便。
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