我怎样才能防止pivot_wider()降低名称中的因子水平?

时间:2019-11-19 15:55:33

标签: r tidyr

如果一个因子的水平存在但当用作names_from参数时,它永远不会出现在数据中,我真的希望pivot_wider用NA创建一个列。例如,第一行给了我两列的小标题,但是我真的很喜欢下面的三列的小标题。

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)

tibble(Person=c("Jackson", "Sarah"), Dog=c(1,1), Cat=c(NA,NA))

如何获取我的NA列中未显示在数据集中的水平?

2 个答案:

答案 0 :(得分:3)

或者,您可以先添加缺少的级别,然后进行转换:

tibble(Person=c("Sarah", "Jackson", "Jackson"), 
       Rank=c(1,1,2), 
       FavoriteAnimal=factor(c("Dog", "Dog", "Cat"))) %>%
 group_by(Person) %>%
 arrange(Rank) %>% 
 slice(1) %>%
 complete(FavoriteAnimal = FavoriteAnimal) %>%
 pivot_wider(names_from = FavoriteAnimal, values_from = Rank)

  Person    Cat   Dog
  <chr>   <dbl> <dbl>
1 Jackson    NA     1
2 Sarah      NA     1

答案 1 :(得分:1)

您可以使用tidyr::spread来做到这一点-spread(key = FavoriteAnimal, value = Rank, drop = FALSE)给您您想要的东西。

不幸的是,在从dropspread的过渡中,pivot_wider参数似乎丢失了。