I would really like pivot_wider to create a column with NAs if the level of a factor exists but never appears in the data when it's used as a names_from argument. For example, the first line gives me a two column tibble, but I'd really like the three column tibble below.
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))
How can I get my column of NAs for levels not appearing in my dataset?
pivot_wider() is the opposite of pivot_longer() : it makes a dataset wider by increasing the number of columns and decreasing the number of rows. It's relatively rare to need pivot_wider() to make tidy data, but it's often useful for creating summary tables for presentation, or data in a format needed by other tools.
pivot_longer() makes datasets longer by increasing the number of rows and decreasing the number of columns. I don't believe it makes sense to describe a dataset as being in “long form”. Length is a relative term, and you can only say (e.g.) that dataset A is longer than dataset B.
The pivot_wider() function from the tidyr package in R can be used to pivot a data frame from a long format to a wide format.
Alternatively, you can first add the missing levels and then do the transformation:
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
You can do it with tidyr::spread
- spread(key = FavoriteAnimal, value = Rank, drop = FALSE)
gives you what you want.
Unfortunately the drop
argument seems to have been lost in the transition from spread
to pivot_wider
.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With