You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让pivot_wider()保留因子水平,生成含NA的缺失因子列?

解决pivot_wider保留因子所有水平的问题

这是个很常见的需求!默认情况下pivot_wider()只会基于数据中实际出现的因子水平来生成列,不过我们有两个简单的方法来保留所有因子水平并填充NA:

方法1:使用names_expand参数(推荐,tidyr 1.3.0+)

从tidyr 1.3.0版本开始,pivot_wider()新增了names_expand参数,设置为TRUE就能强制保留因子的所有水平,哪怕这些水平没在当前数据中出现。直接修改你的代码即可:

library(tibble)
library(dplyr)
library(tidyr)

tibble(Person=c("Sarah", "Jackson", "Jackson"), 
       Rank=c(1,1,2), 
       FavoriteAnimal=factor(c("Dog", "Dog", "Cat"))) %>%
  group_by(Person) %>%
  arrange(Rank) %>%
  slice(1) %>%
  pivot_wider(names_from = FavoriteAnimal, 
              values_from=Rank,
              names_expand = TRUE) # 关键参数

运行后会得到你期望的结果:

# A tibble: 2 × 3
  Person   Dog   Cat
  <chr>  <dbl> <dbl>
1 Jackson     1     2
2 Sarah       1    NA

方法2:用complete()补全因子水平(兼容旧版tidyr)

如果你的tidyr版本低于1.3.0,names_expand参数不存在,可以先用complete()函数补全所有Person和FavoriteAnimal的组合,再执行pivot_wider():

library(tibble)
library(dplyr)
library(tidyr)

tibble(Person=c("Sarah", "Jackson", "Jackson"), 
       Rank=c(1,1,2), 
       FavoriteAnimal=factor(c("Dog", "Dog", "Cat"))) %>%
  group_by(Person) %>%
  arrange(Rank) %>%
  slice(1) %>%
  ungroup() %>% # 必须先取消分组,否则complete只会在组内补全
  complete(Person, FavoriteAnimal) %>% # 补全所有因子水平组合
  pivot_wider(names_from = FavoriteAnimal, values_from=Rank)

这个方法会先为每个Person生成所有FavoriteAnimal的因子水平行,缺失的Rank值自动填充NA,之后再宽表转换就能得到包含所有因子列的结果。

内容的提问来源于stack exchange,提问作者jntrcs

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:34:25