如何让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
相关产品推荐
相关产品推荐

