R中是否有一个函数可以让我将数据集转换为“长格式”,还可以合并列?

我有一个从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问题。

任何人都可以帮助我弄清楚如何完成此工作或了解其他更有效的方法吗?

ccpig520520 回答:R中是否有一个函数可以让我将数据集转换为“长格式”,还可以合并列?

1)ivot_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中的melt

library(data.table)

m1 <- melt(DF,measure.var = grep("Type",names(DF)),value.name = "Type")
melt(m1,measure.var = c("HP",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://www.f2er.com/3130607.html

大家都在问