如何使用R语言tidyr包的complete()函数实现列分组补全?
问题解决:补全tibble的指定组合
原始数据
library(tidyverse) df <- tibble(alph = c("a", "b", "b"), nums = c("1", "2", "2"), vals = c("foo", "bar", "baz"), col = c("x", "y", "z"))
原始输出:
# A tibble: 3 × 4 alph nums vals col <chr> <chr> <chr> <chr> 1 a 1 foo x 2 b 2 bar y 3 b 2 baz z
需求说明
- 基于
alph和vals的现有配对,补全所有nums的可能取值组合 - 缺失的
col值填充为NA,期望输出:
# A tibble: 6 × 4 alph nums vals col <chr> <chr> <chr> <chr> 1 a 1 foo x 2 a 2 foo NA 3 b 1 bar NA 4 b 1 baz NA 5 b 2 bar y 6 b 2 baz z
错误代码分析
你之前尝试的df %>% group_by(alph, nums) %>% complete(alph, nums, vals)无法实现需求,原因是分组后只会在每个(alph, nums)组内补全vals,这和你需要的逻辑不符——你要的是保留alph和vals的原有配对,再和所有nums值组合。
正确实现方法
使用complete()的nesting()参数来保留alph和vals的现有关联,同时指定nums取所有唯一值,代码如下:
df %>% complete(nesting(alph, vals), nums = unique(nums))
代码解释
nesting(alph, vals):保留原始数据中alph和vals的有效配对(即(a,foo)、(b,bar)、(b,baz)),不会生成它们的所有交叉组合nums = unique(nums):指定nums取数据中所有存在的唯一值(即"1"、"2")- 执行后,每个
(alph, vals)配对都会和每个nums值组合,缺失的col自动填充为NA,完全符合期望输出
内容的提问来源于stack exchange,提问作者jophuh
相关产品推荐
相关产品推荐

