dplyr `pivot_longer()` object not found but it's right there?

Viewed 1842
library(tidyverse)
df <- tibble(Date = as.Date(c("2020-01-01", "2020-01-02")),
             Shop = c("Store A", "Store B"),
             Employees = c(5, 10),
             Sales = c(1000, 3000))

#> # A tibble: 2 x 4
#>   Date       Shop    Employees Sales
#>   <date>     <chr>       <dbl> <dbl>
#> 1 2020-01-01 Store A         5  1000
#> 2 2020-01-02 Store B        10  3000

I'm switching from dplyr spread/gather to pivot_* following the dplyr reference guide. I want to gather the "Employees" and "Sales" columns in the following manner:

df %>% pivot_longer(-Date, -Shop, names_to = "Names", values_to = "Values")
#> Error in build_longer_spec(data, !!cols, names_to = names_to, 
#> values_to = values_to, : object 'Shop' not found

But I'm getting this error. It seems as though I'm doing everything right. Except that I'm apparently not. Do you know what went wrong?

2 Answers

The cols argument is all of the columns you want to pivot. You can think of it as the complement of the id.vars argument from reshape2::melt

df %>% pivot_longer(-c(Date, Shop), names_to = "Names", values_to = "Values")

same as:

reshape2::melt(df, id.vars=c("Date", "Shop"), variable.name="Names", value.name="Value")

I think a clearer syntax would be

df %>% 
      pivot_longer(cols = c(Employees, Sales))

As opposed to writing the columns you want to drop.

names_to = "Names", values_to = "Values"

Is just going to capitalize the default new column names of name and value

Related