我有一个源自精灵宝可梦统计数据的数据集,其中包含大量的数值和分类数据。我的最终目标是创建一个模型或推荐系统,用户可以输入精灵的列表,模型找到他们可能喜欢的相似的精灵。目前,数据集如下所示:
ID Name Type1 Type2 HP ATK DEF
001 Bulba.. Grass Poison 45 49 49
ect...
我想把这些数据转换成“长格式”,因为这种格式对R中的许多其他函数更友好,但我在处理Type1/Type2列时遇到了麻烦。有没有一种方法可以将这两列合并成一列(如"Type"),然后将数据转换为新格式?如下所示:
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的gather函数,但我只能使用此方法来真正完成Stat列,而不是Type问题。
有没有人能帮我弄清楚如何做到这一点,或者知道其他更有效的方法?
发布于 2019-11-10 04:12:16
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)将从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"))
https://stackoverflow.com/questions/58785329
复制