Существует ли функция R, которая может преобразовать существующую метрику в новую логическую метрику? - PullRequest
0 голосов
/ 09 ноября 2019

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

ID   Name    Type1    Type2   HP 
001  Bulba.. Grass    Poison  45
ect...

Я понимаю, что метрика type1 / type2 может быть проблематичной. Есть ли функция, которая позволила бы мне создать новый столбец создания / изменения, если бы у покемона былВ конкретный тип будет добавлено логическое значение (0 для false, 1 для true) в этом новом столбце?

Я прошу прощения за объяснение отсутствия блеска, но я хочу, чтобы мой набор данных выглядел так:

ID   Name    Grass  Poison Water  HP 
001  Bulba..    1      1     0    45
ect...

1 Ответ

1 голос
/ 09 ноября 2019

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
...