如何让tidyr::complete()为所有列填充0?
解决complete()批量为所有列填充0的问题
complete()的fill参数要求传入命名列表,无法直接使用fill = 0。当列数较多时,手动逐个指定列名效率极低,可以通过以下两种方式自动生成符合要求的填充列表:
方法1:结合dplyr与purrr快速生成
假设你在complete()中用到的分组/嵌套列是group、item_id和item_name,代码如下:
library(tidyr) library(dplyr) library(purrr) df %>% complete( group, nesting(item_id, item_name), fill = select(., -group, -item_id, -item_name) %>% names() %>% set_names(rep(0, length(.))) )
select(., -group, -item_id, -item_name):筛选出所有需要填充的列(排除用于生成完整组合的列)names():提取这些列的名称set_names(rep(0, length(.))):将列名作为列表的键,对应值统一设为0
方法2:Base R简洁写法
如果不想加载额外包,用Base R也能实现:
library(tidyr) # 筛选出需要填充的列(排除complete中用到的列) fill_cols <- setdiff(names(df), c("group", "item_id", "item_name")) # 生成列名对应0的列表 fill_list <- as.list(rep(0, length(fill_cols))) names(fill_list) <- fill_cols df %>% complete( group, nesting(item_id, item_name), fill = fill_list )
注意事项
- 必须排除
complete()中指定的列(比如示例中的group、item_id、item_name),这些列是用来生成完整组合的,不需要填充0 - 实际使用时,记得将示例中的列名替换为你数据中对应的列名
内容的提问来源于stack exchange,提问作者Doug Fir
相关产品推荐
相关产品推荐

