数据框重复行处理:计算每户教育年限均值及家庭人数
嗨,我来帮你搞定这个计算每户教育年限均值的需求!先说说你原来用by(df$person_number, df$home, max)的思路——这个方法其实有个小隐患:如果person_number不是从1开始的连续编号(比如某户成员编号是1、3,中间漏了2),那用max得到的数字就不等于实际家庭人数了。更稳妥的方式是直接统计每个家庭对应的观测行数,因为每一行就是一个家庭成员嘛~
下面给你几种靠谱的实现方式,按需选择:
方法1:用dplyr(代码简洁易读,推荐)
如果你习惯tidyverse的工具,用dplyr可以一步完成分组统计:
library(dplyr) # 按家庭分组,计算人数和教育年限均值 family_edu_summary <- df %>% group_by(home) %>% summarise( num_people = n(), # n()直接返回每组的行数,也就是家庭人数 avg_education_years = mean(education_year, na.rm = TRUE) # 计算均值,自动跳过缺失值 )
这里的na.rm = TRUE一定要加哦——如果某户有成员的教育年限数据缺失,不加这个参数的话,整户的均值会变成NA,影响后续分析。
方法2:用base R(无需额外安装包)
要是你不想加载第三方包,用base R也能轻松实现:
方式A:一次计算两个指标
用aggregate函数可以同时统计人数和均值:
# 用aggregate分组计算 summary_result <- aggregate( cbind(count = education_year, avg_edu = education_year) ~ home, data = df, FUN = function(x) c(length(x), mean(x, na.rm = TRUE)) ) # 把结果整理成标准数据框格式 summary_result <- do.call(data.frame, summary_result) names(summary_result) <- c("home", "num_people", "avg_education_years")
这里用length(x)统计每组的行数(也就是人数),比依赖person_number靠谱多了。
方式B:分步计算再合并
要是你想把“统计人数”和“计算均值”拆成两步,也可以这样:
# 第一步:统计每户人数,用table统计每个家庭出现的次数 home_count_table <- table(df$home) # 把table转成数据框 home_count_df <- data.frame( home = names(home_count_table), num_people = as.numeric(home_count_table), stringsAsFactors = FALSE ) # 第二步:计算每户教育年限均值 home_edu_avg_df <- aggregate(education_year ~ home, data = df, mean, na.rm = TRUE) # 第三步:合并两个数据框 family_edu_summary <- merge(home_count_df, home_edu_avg_df, by = "home")
这种分步的方式更直观,适合新手理解每一步的逻辑。
不管你选哪种方法,最后得到的family_edu_summary数据框都会包含每个家庭的ID、家庭人数,以及对应的教育年限均值,完全满足你的需求~
内容的提问来源于stack exchange,提问作者Maxi Machado
相关产品推荐
相关产品推荐

