使用dplyr的complete补全数据框缺失值报错,求解决方案
问题与解决方案
问题背景
我们有如下R数据框,经过分组计数后,部分AOI分组缺少Values的部分取值(比如EA缺少Values=1):
library(tidyverse) df = tibble(AOI = c('NA', 'NA', 'NA', 'NA', 'NA', 'EA', 'EA'), Values = c(-1, -1, 0, 1, 1, -1, 0)) # 分组计数后的结果 df = df %>% group_by(AOI, Values) %>% tally()
分组后的数据:
AOI Values n <chr> <dbl> <int> EA -1 1 EA 0 1 NA -1 2 NA 0 1 NA 1 2
尝试用complete补全缺失值时触发报错:
Error in
dplyr::summarise():
! Problem while computing..1 = complete(data = dplyr::cur_data(), ..., fill = fill, explicit = explicit).
ℹ The error occurred in group 1: AOI = "EA".
Caused by error:
! object 'AOI' not found
需要得到的目标输出:
AOI Values n <chr> <dbl> <int> EA -1 1 EA 0 1 EA 1 0 NA -1 2 NA 0 1 NA 1 2
解决方案
1. 修复complete的使用(最直接)
报错的核心原因是数据框仍处于分组状态,complete在分组数据上运行时会错误地将AOI当作分组内变量处理。只需先取消分组,再指定Values的完整取值范围:
df = df %>% ungroup() %>% complete(AOI, Values = c(-1, 0, 1), fill = list(n = 0))
2. 用expand_grid + left_join实现
如果更习惯用连接操作,可以先生成所有AOI和Values的组合,再左连接原数据并填充缺失值:
# 生成所有可能的组合 full_grid = expand_grid(AOI = unique(df$AOI), Values = c(-1, 0, 1)) # 左连接并替换NA为0 df = full_grid %>% left_join(df, by = c("AOI", "Values")) %>% mutate(n = replace_na(n, 0))
3. 分组内直接补全
也可以在分组状态下,用reframe生成每个AOI对应的完整Values序列,并匹配计数:
df = df %>% group_by(AOI) %>% reframe( Values = c(-1, 0, 1), # 匹配原数据中的计数,无匹配则设为0 n = ifelse(Values %in% .data$Values, .data$n[match(Values, .data$Values)], 0) )
内容的提问来源于stack exchange,提问作者Stefano Potter
相关产品推荐
相关产品推荐

