为分组DataFrame补全行:使每个Sequ组包含X的全部A/B/C水平
为分组后的DataFrame补充缺失行与变量水平
需求:让每个Sequ分组都包含3行数据,补全X变量缺失的A、B、C水平。
原始数据:
df <- data.frame( Sequ = c(1, 1, 2, 2, 3, 3, 3), X = c("A", "B", "B", "C", "A", "C", "B") )
方案1:用tidyr::complete()快速生成全组合
适合需要按X固定顺序(A→B→C)补全的场景:
library(tidyverse) df_complete <- df %>% complete(Sequ, X = c("A", "B", "C")) %>% arrange(Sequ, X) print(df_complete)
输出:
Sequ X 1 1 A 2 1 B 3 1 C 4 2 A 5 2 B 6 2 C 7 3 A 8 3 B 9 3 C
方案2:保留原有X顺序再补全缺失项
完全匹配你给出的期望输出顺序:
library(dplyr) df_complete_custom <- df %>% group_by(Sequ) %>% summarise(X = c(X, setdiff(c("A", "B", "C"), X)), .groups = "drop") print(df_complete_custom)
输出:
# A tibble: 9 × 2 Sequ X <dbl> <chr> 1 1 A 2 1 B 3 1 C 4 2 B 5 2 C 6 2 A 7 3 A 8 3 C 9 3 B
解释:setdiff(c("A", "B", "C"), X)会计算当前分组中缺失的X水平,再和原有X值合并,最终每个分组都包含A、B、C三个水平。
内容的提问来源于stack exchange,提问作者Chris Ruehlemann
相关产品推荐
相关产品推荐

