Есть ли в R функция, которая позволит мне преобразовывать набор данных в "длинный формат", но также объединять столбцы? - PullRequest
1 голос
/ 10 ноября 2019

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

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

Я хочу преобразовать эти данные в «длинный формат», потому что этот формат более дружественен по отношению ко многим другим функциям в R, но у меня возникают проблемы при работесо столбцами Type1 / Type2. Есть ли способ, которым я могу объединить эти два в столбцы в один столбец (например, «Тип»), а затем преобразовать данные в новый формат? Примерно так:

ID   Name    Type    Stat   Value
 001  Bulba.. Grass  HP     45
 001  Bulba.. Poison HP     45
 001  Bulba.. Grass  ATK    49
 001  Bulba.. Poison ATK    49

Я понимаю, что для покемонов двойного типа это будет псевдо-запись, но я не вижу более чистого способа сделать это. Я также знаю об использовании функции сбора dpylr, но я действительно могу выполнить только столбец Stat, используя этот метод, а не проблему типа.

Может кто-нибудь помочь мне выяснить, как я могу это сделать, или узнать другие более эффективные методы

1 Ответ

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

1) pivot_longer Измените кадр данных дважды так:

library(dplyr)
library(tidyr)

DF %>%
  pivot_longer(starts_with("Type"), values_to = "Type") %>%
  select(-name) %>%
  pivot_longer(c("HP", "ATK", "DEF"), names_to = "Stat", values_to = "Value")

, получив:

# A tibble: 6 x 5
  ID    Name    Type   Stat  Value
  <chr> <chr>   <chr>  <chr> <int>
1 001   Bulba.. Grass  HP       45
2 001   Bulba.. Grass  ATK      49
3 001   Bulba.. Grass  DEF      49
4 001   Bulba.. Poison HP       45
5 001   Bulba.. Poison ATK      49
6 001   Bulba.. Poison DEF      49

2) плавить поочередноиспользуйте melt из data.table дважды.

library(data.table)

m1 <- melt(DF, measure.var = grep("Type", names(DF)), value.name = "Type")
melt(m1, measure.var = c("HP", "ATK", "DEF"), 
  variable.name = "Stat", value.name = "Value")[-3]

, давая:

   ID    Name   Type Stat Value
1 001 Bulba..  Grass   HP    45
2 001 Bulba.. Poison   HP    45
3 001 Bulba..  Grass  ATK    49
4 001 Bulba.. Poison  ATK    49
5 001 Bulba..  Grass  DEF    49
6 001 Bulba.. Poison  DEF    49

Примечание

DF в воспроизводимой форме предполагалось равным:

Lines <- "
ID   Name    Type1    Type2   HP  ATK   DEF
001  Bulba.. Grass    Poison  45  49    49"
DF <- read.table(text = Lines, header = TRUE, as.is = TRUE, 
  colClasses = list(ID = "character"))
...