R语言数据处理疑问:为何统计亲属照料信息时丢失大量行
问题原因与解决方案
嗨,这个问题很常见,我来帮你理清楚~
你得到的结果只有4564行,核心原因是你直接在relative数据集上做了分组统计,但这个数据集本身只包含有亲属照料记录的老年人,那些没有任何照料记录的老人根本没被纳入统计流程里。而且如果没有把统计结果和全量的senior表做关联,自然只会输出有数据的行,丢失了无照料记录的老人。
要得到包含所有10628位老人的结果,关键是要以senior表为基础(确保所有老人都被保留),再关联relative的数据进行统计。这里有两种常用的dplyr实现方法:
方法一:先左连接再分组汇总
从全量的老人表出发,用left_join关联照料数据,这样所有老人都会被保留,无照料记录的老人对应的id_relative和hours_care会自动填充为NA,之后再分组统计:
library(dplyr) final_result <- senior %>% # 左连接,保留senior的所有行 left_join(relative, by = "id_senior") %>% # 按老人ID分组 group_by(id_senior) %>% # 统计亲属数量和总时长 summarise( # 去重统计亲属数,排除NA(无照料的会返回0) nbr_relative = n_distinct(id_relative, na.rm = TRUE), # 求和时不忽略NA,这样无照料的会保留NA sum_hours = sum(hours_care, na.rm = FALSE) )
方法二:先统计照料数据再左连接
先在relative上完成分组统计,再把结果左连接到senior表,最后补全缺失值:
library(dplyr) # 先统计有照料记录的老人的亲属数和总时长 care_summary <- relative %>% group_by(id_senior) %>% summarise( nbr_relative = n_distinct(id_relative), sum_hours = sum(hours_care) ) # 关联到全量老人表,补全无照料老人的亲属数为0,总时长保留NA final_result <- senior %>% left_join(care_summary, by = "id_senior") %>% mutate(nbr_relative = replace_na(nbr_relative, 0))
两种方法都能得到10628行的结果,其中无照料记录的老人nbr_relative为0,sum_hours为NA,完全符合你的需求~
内容的提问来源于stack exchange,提问作者Emeline
相关产品推荐
相关产品推荐

