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

数据框重复行处理:计算每户教育年限均值及家庭人数

嗨,我来帮你搞定这个计算每户教育年限均值的需求!先说说你原来用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:02:54