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

如何按Resident.ID分组,用最常见有效值修正数据框人口统计字段?

居民人口统计数据清洗的R实现方案

核心逻辑

  • 按Resident.ID分组,先排除Unknown、Preferred not to Answer这类无效值,取组内最常见的有效值统一替换该ID下的所有行
  • 若分组内无有效值(全是无效值/缺失),保留原字段内容
  • Resident.ID为NA的行,直接保留原字段值不变

示例数据集

先构建用于测试的模拟数据:

library(dplyr)

sample_data <- tibble(
  Resident.ID = c(1, 1, 1, 2, 2, NA, NA),
  Race = c("White", "Unknown", "White", "Black", "Preferred not to Answer", "Asian", "Unknown"),
  Ethnicity = c("Hispanic", "Hispanic", "Unknown", NA, "Non-Hispanic", "Non-Hispanic", NA)
)

正确代码实现

cleaned_data <- sample_data %>%
  # 保留NA的ID分组,不自动丢弃
  group_by(Resident.ID, .drop = FALSE) %>%
  # 批量处理需要清洗的字段(可根据实际字段调整)
  mutate(across(c(Race, Ethnicity), function(col) {
    # 筛选当前字段的有效值
    valid_vals <- col[!col %in% c("Unknown", "Preferred not to Answer") & !is.na(col)]
    
    if (length(valid_vals) == 0) {
      # 无有效值时返回原字段,避免错误覆盖
      return(col)
    } else {
      # 计算最常见的有效值(众数)
      mode_val <- names(sort(table(valid_vals), decreasing = TRUE))[1]
      # 用众数替换组内所有行的该字段
      return(rep(mode_val, length(col)))
    }
  })) %>%
  ungroup()

代码说明

  • group_by(Resident.ID, .drop = FALSE):确保Resident.ID为NA的行也能被单独分组处理,不会被遗漏
  • across():批量指定需要清洗的字段,无需逐个字段写重复逻辑
  • 有效值筛选:严格排除指定无效值和NA,只保留有效统计值
  • 众数计算:通过table()统计频次后取最高频的值,保证用最常见的有效值统一分组数据

验证清洗结果

运行代码后,示例数据的输出结果如下:

print(cleaned_data)
#> # A tibble: 7 × 3
#>   Resident.ID Race  Ethnicity  
#>         <dbl> <chr> <chr>      
#> 1           1 White Hispanic   
#> 2           1 White Hispanic   
#> 3           1 White Hispanic   
#> 4           2 Black Non-Hispanic
#> 5           2 Black Non-Hispanic
#> 6          NA Asian Non-Hispanic
#> 7          NA Unknown NA

可见:

  • ID=1的Race统一为最常见的White,Ethnicity统一为Hispanic
  • ID=2的Race统一为Black,Ethnicity统一为Non-Hispanic
  • Resident.ID为NA的行完全保留原字段值,没有被错误修改

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 03:43:32