R语言:按年龄组计算二元虚拟变量占比及绘图问题求助
问题描述
我是R语言及编程新手,需要将虚拟变量按年龄组占比绘图。已创建虚拟变量并完成计数,现需解决两个问题:
- 按
age13x年龄组计算虚拟变量hospsD的占比 - 解决绘图时出现的“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
相关产品推荐
相关产品推荐

