如何为英国数据集添加按agelfted分组的genhealth=1比例列
解决分组计算genhealth==1占比的问题
首先,咱们先拆解下你代码里的问题:
- 语法错误:你写的代码里
by=c(subset("genhealth"==1),"agelifted")后面漏了逗号,导致FUN前面没有正确分隔,这是触发报错的直接原因。 - 逻辑错误:
subset("genhealth"==1)的写法完全不对——你把字符串"genhealth"和1做比较,结果永远是FALSE,而且subset是用来筛选行的工具,不能这么放在aggregate的by参数里。另外aggregate的by参数需要明确指定分组变量,不是这样组合的。
接下来给你几种简单高效的解决方案,按需选择:
方法1:用基础R的ave函数(最直接)
ave可以直接按分组计算结果,并自动把结果匹配回原数据的每一行,一步到位:
# 直接在oreo中添加gh列,按agelifted分组计算genhealth==1的占比 oreo$gh <- ave(oreo$genhealth, oreo$agelifted, FUN = function(x) mean(x == 1))
这里mean(x == 1)等价于sum(x == 1)/length(x),直接算出比例,非常简洁。
方法2:用dplyr包(语法更直观)
如果你习惯用tidyverse风格的代码,dplyr的分组操作逻辑会更清晰:
library(dplyr) oreo <- oreo %>% group_by(agelifted) %>% # 按agelifted字段分组 mutate(gh = mean(genhealth == 1)) %>% # 计算每组的目标占比并生成新列 ungroup() # 取消分组状态,避免后续操作受影响
方法3:用基础R的aggregate(贴合你的初始思路)
如果你想严格按照最开始的分步思路实现,也可以这么做:
# 1. 计算每组中genhealth==1的观测数量 count_gen1 <- aggregate(genhealth ~ agelifted, data = oreo, FUN = function(x) sum(x == 1)) # 2. 计算每组的总观测数 count_total <- aggregate(genhealth ~ agelifted, data = oreo, FUN = length) # 3. 合并两个结果并计算占比 proportion_df <- merge(count_gen1, count_total, by = "agelifted", suffixes = c("_gen1", "_total")) proportion_df$gh <- proportion_df$genhealth_gen1 / proportion_df$genhealth_total # 4. 把占比列合并回原数据框 oreo <- merge(oreo, proportion_df[, c("agelifted", "gh")], by = "agelifted")
这几种方法都能实现你的需求,其中ave和dplyr的方法更高效简洁,推荐优先尝试~
内容的提问来源于stack exchange,提问作者Collective Action
相关产品推荐
相关产品推荐

