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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 22:05:59