Проблемы с использованием pivot_wider tidyr на нескольких столбцах - PullRequest
2 голосов
/ 06 марта 2020

Я пытаюсь использовать функцию pivot_wider из tidyr, чтобы транспонировать два вида значений одновременно, как показано в примере «Несколько наблюдений на строку» под виньеткой ('pivot'), но я продолжаю получать странные сообщения об ошибках .

Вот пример того, что происходит:

set.seed(5)
testdat <- data.frame(matrix(nrow=5,ncol=5))
colnames(testdat) <- c('rating','percent.Female','percent.Male','se.Female','se.Male')
testdat$rating <- c('Very good','Good','OK','Bad','Very bad')
testdat$percent.Female <- rnorm(5,.5,.2)
testdat$percent.Male <- 1 - testdat$percent.Female
testdat$se.Female <- rnorm(5,0.1,0.003)
testdat$se.Male <- rnorm(5,0.1,0.003)
testdat
     rating percent.Female percent.Male  se.Female    se.Male
1 Very good      0.3318289    0.6681711 0.09819128 0.10368289
2      Good      0.7768719    0.2231281 0.09858350 0.09759466
3        OK      0.2489016    0.7510984 0.09809389 0.09675882
4       Bad      0.5140286    0.4859714 0.09914268 0.09952740
5  Very bad      0.8422882    0.1577118 0.10041432 0.09678472
testdat %>% pivot_longer(cols=-"rating",names_sep=".",names_to=c(".value","gender"),values_drop_na=T)
Error: Expected a vector, not NULL
Call `rlang::last_error()` to see a backtrace
In addition: Warning message:
Expected 2 pieces. Additional pieces discarded in 4 rows [1, 2, 3, 4]

Я почти точно следил за виньеткой - почему это не работает?

1 Ответ

4 голосов
/ 06 марта 2020

Проблемы с кодом возникают из-за опции names_sep="." (вы увидите, что в сводной виньетке имена разделяются символом _ вместо.)

. - это специальный символ, предназначенный соответствовать любому отдельному символу. Если вы хотите указать, что имена ваших переменных разделены самим фактическим символом ., вам нужно использовать names_sep="\\.", чтобы экранировать его.

С экранированием на месте, пример получается так:

testdat %>% 
  pivot_longer(cols=-"rating", names_sep="\\.", 
               names_to=c(".value","gender"), values_drop_na=TRUE)
# A tibble: 10 x 4
   rating    gender percent     se
   <chr>     <chr>    <dbl>  <dbl>
 1 Very good Female   0.332 0.0982
 2 Very good Male     0.668 0.104 
 3 Good      Female   0.777 0.0986
 4 Good      Male     0.223 0.0976
 5 OK        Female   0.249 0.0981
 6 OK        Male     0.751 0.0968
 7 Bad       Female   0.514 0.0991
 8 Bad       Male     0.486 0.0995
 9 Very bad  Female   0.842 0.100 
10 Very bad  Male     0.158 0.0968
...