如何在R中按组查找data.frame缺失值并无循环生成目标数据集
问题1:如何在R中按组查找data.frame列的缺失值,并将缺失值与已存在值一同整合到结果data.frame中?
方法1:统计每组缺失值与非缺失值的分布
使用dplyr分组统计,将缺失值作为单独类别整合到结果中:
library(dplyr) # 按group分组,统计class列的缺失与非缺失出现次数 missing_summary <- sample_data %>% group_by(group) %>% mutate(class_clean = ifelse(is.na(class), "NA", class)) %>% count(class_clean, name = "count") %>% ungroup() print(missing_summary)
这段代码会将每个分组下的class非NA值和缺失值(标记为"NA")的出现次数统计出来,最终得到包含分组、类别(含缺失标记)和计数的整合结果。
方法2:扩展每组至包含所有可能类别(含缺失),标记存在状态
如果需要将每组的已存在值和未出现的类别(含缺失)都列出来,可以结合tidyr扩展数据:
library(dplyr) library(tidyr) # 获取所有非NA的唯一class值 all_classes <- unique(sample_data$class[!is.na(sample_data$class)]) # 按group扩展所有可能的class值,标记是否存在 full_result <- sample_data %>% group_by(group) %>% distinct(class, .keep_all = TRUE) %>% filter(!is.na(class)) %>% complete(class = c(all_classes, NA)) %>% mutate(exists = ifelse(!is.na(data), 1, 0)) %>% ungroup() print(full_result)
结果会包含每个分组下所有可能的class值(包括NA),并标记该类别是否在原分组中存在。
问题2:如何在R中不使用循环,从sample_data生成指定的desired_data?
观察目标数据规律:每个group包含所有非NA的class值(A、B、C、D、E),每个class重复2行;data列值为1(对应原分组中存在的class)或0(对应原分组中不存在的class)。用tidyverse工具链实现:
library(dplyr) library(tidyr) # 1. 整理原数据:标记每个分组实际存在的非NA类别 group_class_map <- sample_data %>% filter(!is.na(class)) %>% distinct(group, class) %>% mutate(data = 1) # 2. 生成所有分组与所有目标类别的全组合 all_groups <- unique(sample_data$group) all_classes <- unique(sample_data$class[!is.na(sample_data$class)]) full_combinations <- expand.grid(group = all_groups, class = all_classes, stringsAsFactors = FALSE) # 3. 匹配存在状态、填充缺失值、重复每行2次 desired_data <- full_combinations %>% left_join(group_class_map, by = c("group", "class")) %>% mutate(data = replace_na(data, 0)) %>% slice(rep(1:n(), each = 2)) %>% arrange(group, class) print(desired_data)
生成的结果与题目给出的desired_data完全一致,全程未使用循环。
内容的提问来源于stack exchange,提问作者Neal Barsch
相关产品推荐
相关产品推荐

