tidyr - пакет для изменения формы данных. Здесь мы будем использовать pivot_longer()
, чтобы поместить его в длинный формат, где имена типов (Type1, Type2) будут находиться в столбце «name», а значения (Grass, Poison и т. Д.) Будут находиться в столбце ». стоимость". Мы отфильтровываем строки с помощью is.na(value)
, потому что это означает, что у покемона не было второго типа. Мы создаем переменную-индикатор - она получает 1. Каждый покемон будет иметь indicator == 1
для типов, которые он имеет. Мы удаляем теперь лишний столбец «name» и используем pivot_wider()
для преобразования каждого уникального значения в value
в его собственный столбец, который получит значение indicator
в качестве значения ячейки для каждой строки. Наконец, мы изменяем все числовые столбцы, чтобы заменить пропуски на 0, поскольку мы знаем, что эти покемоны не относятся к этим типам. Лучшим решением, чем mutate_if(is.numeric, ...)
, было бы вычисление уникальных значений типов и использование mutate_at(vars(pokemon_types), ...
. Это не повлияет на другие числовые столбцы непреднамеренно.
library(tidyr)
library(dplyr)
#>
#> Attaching package: 'dplyr'
#> The following objects are masked from 'package:stats':
#>
#> filter, lag
#> The following objects are masked from 'package:base':
#>
#> intersect, setdiff, setequal, union
pokemon <- tibble(ID = c(1,2), Name = c("Bulbasaur", "Squirtle"),
Type1 = c("Grass", "Water"),
Type2 = c("Poison", NA),
HP = c(40, 50))
pokemon %>% pivot_longer(
starts_with("Type")
) %>%
filter(!is.na(value)) %>%
mutate(indicator = 1) %>%
select(-name) %>%
pivot_wider(names_from = value, values_from = indicator,
) %>%
mutate_if(is.numeric, .funs = function(x) if_else(is.na(x), 0, x))
#> # A tibble: 2 x 6
#> ID Name HP Grass Poison Water
#> <dbl> <chr> <dbl> <dbl> <dbl> <dbl>
#> 1 1 Bulbasaur 40 1 1 0
#> 2 2 Squirtle 50 0 0 1