Есть ли в R функция, которая позволит мне преобразовать набор данных в "длинный формат", но также объединить столбцы?
У меня есть набор данных, полученный из статистики покемонов, содержащий множество числовых и категориальных данных. Моя конечная цель - создать модель или систему рекомендаций, в которой пользователь может ввести список покемонов, и модель найдет похожих покемонов, которые могут им понравиться. В настоящее время набор данных выглядит примерно так:
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
Я понимаю, что для Pokemon Dual-type это будет псевдозапись, но я не вижу более чистого способа сделать это. Я также знаю об использовании функции сбора dpylr, но я действительно могу выполнить только столбец Stat, используя этот метод, а не проблему типа.
Может ли кто-нибудь помочь мне выяснить, как я могу это сделать, или узнать какие-либо другие более эффективные методы?
1 ответ
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"))