Работа с АН после запуска pivot_wider - PullRequest
0 голосов
/ 09 февраля 2020

У меня есть длинный фрейм данных, который я хочу сделать широким, используя pivot_wider:

library(tidyr)
example_data <- data.frame(
    name = c("bob", "bob", "dick", "dick", "harry", "harry"), 
    sport = c("baseball", "football", "hockey", "basketball", "football", "basketball")
)
pivot_wider(example_data, names_from = sport, values_from = sport)

Это дает ожидаемый результат, но с большим количеством NA s

  name  baseball football hockey basketball
1 bob   baseball football NA     NA        
2 dick  NA       NA       hockey basketball
3 harry NA       football NA     basketball

Я хочу преобразовать названия видов спорта в TRUE (так как название вида спорта уже указано в имени столбца) и преобразовать NA s в FALSE, создавая фрейм данных, подобный этому:

   name baseball football hockey basketball
1   bob     TRUE     TRUE  FALSE      FALSE
2  dick    FALSE    FALSE   TRUE       TRUE
3 harry    FALSE     TRUE  FALSE       TRUE

Я думал, что этот код сработает, но он выдал ошибку:

pivot_wider(
    example_data, 
    names_from = sport, 
    values_from = sport,
    values_fill = list(sport = FALSE),
    values_fn = list(sport = !is.na)
)
Error in !is.na : invalid argument type

Приведенный ниже код возвращает меня к тому, что я ищу, и затем я мог бы преобразовать его. до желаемого кадра данных:

pivot_wider(
    example_data, 
    names_from = sport, 
    values_from = sport,
    values_fill = list(sport = TRUE),
    values_fn = list(sport = is.na)
)

Есть ли способ получить непосредственно к желаемому кадру данных? И есть ли какие-то учебные пособия по использованию аргумента values_fn, чтобы я мог понять, почему values_fn = list(sport = !is.na) не работает? Спасибо.

1 Ответ

1 голос
/ 09 февраля 2020

Один из способов - создать фиктивный столбец со значениями TRUE, а затем использовать pivot_wider.

library(dplyr)
library(tidyr)

example_data %>%
  mutate(val = TRUE) %>%
  pivot_wider(names_from = sport,values_from = val,values_fill = list(val = FALSE))


# A tibble: 3 x 5
#  name  baseball football hockey basketball
#  <fct> <lgl>    <lgl>    <lgl>  <lgl>     
#1 bob   TRUE     TRUE     FALSE  FALSE     
#2 dick  FALSE    FALSE    TRUE   TRUE      
#3 harry FALSE    TRUE     FALSE  TRUE    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...