如何按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
相关产品推荐
相关产品推荐

