Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 用2个变量聚合一个值_R_Variables_Aggregate_Multiple Columns - Fatal编程技术网

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