将值汇总为2个变量

时间:2017-05-09 12:55:49

标签: 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-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(最上面一行)是在单元格中显示的人数,即该年龄段和人数的平均工作数。

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

2 个答案:

答案 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