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

R语言:按年龄组计算二元虚拟变量占比及绘图问题求助

问题描述

我是R语言及编程新手,需要将虚拟变量按年龄组占比绘图。已创建虚拟变量并完成计数,现需解决两个问题:

  1. 按age13x年龄组计算虚拟变量hospsD的占比
  2. 解决绘图时出现的“object 'age13x' not found”错误

数据

处理数据的代码及结果如下:

meps_2013<-
  meps_2013%>%
  select(dupersid,age13x,ipdis13,sex)%>%
  mutate(hospsD = ifelse(meps_2013$ipdis13 >= 1 & meps_2013$ipdis13 <= 9, 1, 0))
meps_2013

数据预览:

# A tibble: 36,940 × 3
   dupersid age13x ipdis13
      <dbl>  <dbl>   <dbl>
 1 20004101     39       0
 2 20004102     40       0
 3 20004103     10       0
 4 20005101     52       0
 5 20005102     22       0
 6 20005103     19       0
 7 20006101     43       0
 8 20006102     42       0
 9 20006103     15       0
10 20006104     21       0
# … with 36,930 more rows

其中ipdis13是用于创建虚拟变量的原始变量。


已完成操作

虚拟变量hospsD的规则:当ipdis13取值1-9时设为1,其余情况设为0。相关代码及计数结果如下:

meps_2013<-
  meps_2013%>%
  select(dupersid,age13x,ipdis13,sex)%>%
  mutate(hospsD = ifelse(meps_2013$ipdis13 >= 1 & meps_2013$ipdis13 <= 9, 1, 0))
meps_2013

no_hospD <- ifelse(meps_2013$ipdis13 == 0, 1, 0)

count(meps_2013, c("hospsD", "no_hospD"))

计数结果:

hospsD no_hospD  freq
1      0        0     2
2      0        1 34694
3      1        0  2244

报错的绘图代码及错误信息

尝试按年龄组计算占比并绘图的代码:

summary_data <- meps_2013%>%
  group_by(age13x)%>%
  summarize(mean_hosps = mean(hospsD,na.rm=TRUE))
  
ggplot(summary_data, aes(x = age13x, y = mean_hosps)) +
  geom_smooth(method = "lm") +
  geom_point() +
  labs(x="Age", y="Hospitalizations")
summary_data

出现错误:

Error in FUN(X[[i]], ...) : object 'age13x' not found

尝试的data.table代码

曾尝试用data.table计算占比,但不确定是否正确:

setDT(meps_2013)[, .(Frac = sum(hospsD == 1, na.rm = TRUE)), by = age13x][, Frac := Frac/sum(Frac)][]

解决方案

1. 解决“object 'age13x' not found”错误

错误根源是管道操作中mutate里错误使用了全局环境的meps_2013$ipdis13,导致变量作用域混乱。修正写法,直接引用管道内的变量:

meps_2013 <- meps_2013 %>%
  select(dupersid, age13x, ipdis13, sex) %>%
  mutate(hospsD = ifelse(ipdis13 >= 1 & ipdis13 <= 9, 1, 0))

管道中mutate可直接调用前面数据框的变量,无需加数据框前缀。

2. 按年龄组计算占比

用dplyr实现

计算每个年龄组内hospsD=1的占比(住院人数/该年龄组总人数):

summary_data <- meps_2013 %>%
  group_by(age13x) %>%
  summarize(
    total = n(),
    hosp_count = sum(hospsD, na.rm = TRUE),
    hosp_ratio = hosp_count / total
  )

注:mean(hospsD)结果和hosp_ratio一致,因为0-1变量的均值就是占比。

修正后的绘图代码

确保summary_data包含age13x列后,绘图代码可正常运行:

library(ggplot2)

ggplot(summary_data, aes(x = age13x, y = hosp_ratio)) +
  geom_smooth(method = "lm", se = TRUE) +
  geom_point(size = 2) +
  labs(x = "年龄", y = "住院占比") +
  theme_minimal()

用data.table正确计算年龄组占比

你之前的代码计算的是各年龄组住院人数占总住院人数的比例,如果要算年龄组内部的住院占比,修改为:

library(data.table)

setDT(meps_2013)[, .(
  total = .N,
  hosp_count = sum(hospsD == 1, na.rm = TRUE),
  hosp_ratio = sum(hospsD == 1, na.rm = TRUE) / .N
), by = age13x]

内容的提问来源于stack exchange,提问作者CarolineM84

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 13:55:16