我有一个从Pokemon统计数据衍生的数据集,其中包含许多数字和分类数据。我的最终目标是创建一个模型或推荐系统,以便用户可以输入口袋妖怪的列表,并且模型可以找到他们可能喜欢的类似口袋妖怪。当前数据集看起来像这样:
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
我知道对于Dual-type的Pokemon,它会创建一个伪条目,但是我看不到任何更干净的方法来完成此操作。我也知道使用dpylr的collect函数,但是我只能使用此方法真正完成Stat列,而不是Type问题。
任何人都可以帮助我弄清楚如何完成此工作,或者知道其他更有效的方法吗?
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)熔体两次使用data.table中的给予:melt
。
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 =“字符”))