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

如何为英国数据集添加按agelfted分组的genhealth=1比例列

解决分组计算genhealth==1占比的问题

首先,咱们先拆解下你代码里的问题:

  1. 语法错误:你写的代码里by=c(subset("genhealth"==1),"agelifted")后面漏了逗号,导致FUN前面没有正确分隔,这是触发报错的直接原因。
  2. 逻辑错误: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:48:21