首页 > 解决方案 > 根据 2 列值合并行

问题描述

region.  age.   pop 
SSC21184    0   209
SSC21184    1   195
SSC21184    2   242
SSC21184    3   248
SSC21185    0   231
SSC21185    1   287
SSC21185    2   268
SSC21185    3   257

我正在寻找:

所以它应该看起来像这样:

region.  age_group.   pop 
SSC21184    <2       404
SSC21184    >=2      490
SSC21185    <2       518
SSC21185    >=2      524

我尝试使用tapply(df$pop, df$agegroup, FUN = mean) %>% as.data.frame(),但是我继续收到错误:参数必须具有相同的长度

编辑:如果可能的话,我将如何绘制每个地区每个年龄组的人口?例如,堆积条形图?谢谢!

标签: rdplyr

解决方案


如果您只有两个年龄段需要更改,我们可以使用ifelse

library(dplyr)

df %>%
  group_by(region, age = ifelse(age >=2, '>=2', '<2')) %>%
  summarise(sum = sum(pop))


#   region   age     sum
#  <chr>    <fct> <int>
#1 SSC21184 < 2     404
#2 SSC21184 >=2     490
#3 SSC21185 < 2     518
#4 SSC21185 >=2     525

cut如果您有大量的年龄组,则可以使用更通用的解决方案。

df %>%
  group_by(region, age = cut(age, breaks = c(-Inf, 1, Inf), 
                   labels = c('< 2', '>=2'))) %>%
  summarise(sum = sum(pop))

我们也可以使用相同的逻辑tapply

with(df, tapply(pop, list(region, ifelse(age >=2, '>=2', '<2')), sum))

#         <2 >=2
#SSC21184 404 490
#SSC21185 518 525

推荐阅读