R语言使用complete为分组补NA使各组长度等于最大分组长度
问题说明
你现有如下R数据框:
df <- structure(list(id = c(1L, 1L, 1L, 2L, 2L, 3L), var = c("A", "B", "C", "B", "C", "C")), class = "data.frame", row.names = c(NA, -6L)) # 原始数据预览 id var 1 1 A 2 1 B 3 1 C 4 2 B 5 2 C 6 3 C
期望得到如下目标数据框:
id var 1 1 A 2 1 B 3 1 C 4 2 <NA> 5 2 B 6 2 C 7 3 <NA> 8 3 <NA> 9 3 C
你此前尝试的代码如下,无法得到预期结果:
df %>% complete(id, var, fill=list(NA))
实现方案
你的需求本质是给每个id补全行,对齐所有var的顺序,缺失的对应位置var列留NA,两种实现方法如下:
方法1:使用complete实现
通过新增var的顺序索引作为补全维度,匹配不到的var自然返回NA:
library(tidyverse) df %>% # 给var按出现顺序生成唯一索引 mutate(var_idx = match(var, unique(df$var))) %>% # 按id和全量var索引补全所有行 complete(id, var_idx = seq_along(unique(df$var))) %>% # 移除辅助索引列,得到结果 select(id, var)
方法2:使用expand.grid实现
先生成所有id和var索引的全组合,再和原数据匹配:
# 生成id和var索引的全量组合 full_grid <- expand.grid( id = unique(df$id), var_idx = seq_along(unique(df$var)) ) # 给原数据添加var索引 df$var_idx <- match(df$var, unique(df$var)) # 左匹配得到结果,按id排序 result <- merge(full_grid, df, by = c("id", "var_idx"), all.x = TRUE) result <- result[order(result$id), c("id", "var")]
原代码问题说明
你之前的代码存在两处问题:
- 直接用id和var作为补全维度,
complete会生成两者的全笛卡尔积,每个id都会匹配所有存在的var有效值,不会出现var为NA的行 fill参数语法错误,需要传入命名列表指定要填充的列和对应值,不符合你需要在缺失位置保留var为NA的需求
内容的提问来源于stack exchange,提问作者TarJae
相关产品推荐
相关产品推荐

