1

我有一个来自口袋妖怪统计数据的数据集,其中包含大量数字和分类数据。我的最终目标是创建一个模型或推荐系统,用户可以输入口袋妖怪列表,模型会找到他们可能喜欢的类似口袋妖怪。目前,数据集看起来像这样:

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 列,而不是 Type 问题。

任何人都可以帮我弄清楚我如何做到这一点或知道其他更有效的方法吗?

4

1 回答 1

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 交替使用meltfrom 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"))
于 2019-11-10T04:12:15.693 回答