如何在R语言中基于分组值为原数据框添加计数新变量?
问题:按分组为原数据添加组内计数变量
处理调查数据时,想要创建名为population的新变量,值为按性别(SEX)和种族(RACE)分组后的组内人数。已生成包含分组计数的新数据框,但无法将值赋值回原数据。
尝试的代码
# 创建包含分组计数的新数据框 population <- age_data %>% group_by(RACE, SEX) %>% summarise(count = n()) # 尝试为原数据添加计数变量 age_data$population <- ifelse(population$RACE== age_data$RACE& population$SEX == age_data$SEX, population$count, NA)
也尝试过case_when()及基础R语法,均出现类似报错:
Error in `stop_vctrs()`: ! Can't recycle `..1` (size 24) to match `..2` (size 169588). Backtrace: 1. base::ifelse(...) 5. vctrs::stop_incompatible_size(...) 6. vctrs:::stop_incompatible(...) 7. vctrs:::stop_vctrs(...)
问题根源是分组仅生成24个类别值,原数据有169588行,向量大小不匹配,无法直接逐元素匹配。
简化示例数据
SEX RACE 1 1 2 3 1 1 1 2 2 3 2 1 1 3
期望结果
SEX RACE POPULATION 1 1 2 2 3 2 1 1 2 1 2 1 2 1 1 2 3 2 1 3 1
解决方案
方法1:直接在原数据分组后添加计数(推荐)
无需单独生成分组计数数据框,直接用dplyr的mutate在分组后为每一行填充组内人数:
library(dplyr) age_data <- age_data %>% group_by(RACE, SEX) %>% mutate(population = n()) %>% ungroup() # 可选,取消数据框的分组状态
mutate(n())会自动为每个分组的所有行填充组内总人数,完美匹配原数据行数,不会出现大小不兼容问题。
方法2:通过合并数据框实现
如果需要保留单独的分组计数数据框,可使用left_join将计数合并回原数据:
library(dplyr) # 生成分组计数数据框,取消分组状态 population_counts <- age_data %>% group_by(RACE, SEX) %>% summarise(population = n(), .groups = "drop") # 按RACE和SEX匹配,将计数合并到原数据 age_data <- age_data %>% left_join(population_counts, by = c("RACE", "SEX"))
left_join会根据指定的匹配列自动将分组计数对应到原数据的每一行,解决向量大小不匹配的问题。
内容的提问来源于stack exchange,提问作者Danika
相关产品推荐
相关产品推荐

