如何在R语言中按分组计算DataFrame列中空单元格的占比并生成新DataFrame
解决分组空单元格占比计算问题
嘿,我来帮你修正代码~你当前的问题主要是在dplyr的summarise步骤里用错了函数,另外要注意你的数据中空值是**空字符串""**而非标准的NA,判断逻辑得对应上。
先理清楚需求:每个人对应3条记录,我们要统计每组里空字符串的数量,再除以组内总条数得到空单元格占比。
正确的dplyr实现代码
library(dplyr) # 你的原始数据集 df <- data.frame( name = c("Jon", "Bill", "Maria", "Ben", "Emma", "Jon", "Bill", "Maria", "Ben", "Emma", "Jon", "Bill", "Maria", "Ben", "Emma"), data = c(1, "", 3, 1, "",3, 4, "", 1, "", 1, 3, 3, 1, 3) ) # 计算空单元格占比并生成结果集 df_result <- df %>% group_by(name) %>% summarise( # 统计分组内空字符串的数量 miss_count = sum(data == ""), # 计算空值占比:空值数量 / 分组总记录数 percentage = round(miss_count / n(), 2) ) %>% # 按姓名排序,和你期望的结果顺序一致 arrange(name) %>% # 仅保留需要的列 select(name, percentage) # 查看最终结果 df_result
代码细节解释
sum(data == ""):因为你的空值是""而非NA,所以用这个逻辑统计每组内空单元格的数量,不能用is.na()判断。n():获取当前分组的总记录数,这个写法更通用——哪怕后续分组的记录数不一致,也能正确计算占比。round(..., 2):将占比保留两位小数,和你给出的期望结果完全匹配。
运行后得到的结果和你预期的df_result完全一致:
# A tibble: 5 × 2 name percentage <chr> <dbl> 1 Ben 0 2 Bill 0.33 3 Emma 0.67 4 Jon 0 5 Maria 0.33
内容的提问来源于stack exchange,提问作者Catherine




