You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 16:02:32