首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >R中有没有一个函数可以让我将数据集转换成“长格式”,但也可以合并列?

R中有没有一个函数可以让我将数据集转换成“长格式”,但也可以合并列?
EN

Stack Overflow用户
提问于 2019-11-10 10:46:21
回答 1查看 86关注 0票数 1

我有一个源自精灵宝可梦统计数据的数据集,其中包含大量的数值和分类数据。我的最终目标是创建一个模型或推荐系统,用户可以输入精灵的列表,模型找到他们可能喜欢的相似的精灵。目前,数据集如下所示:

代码语言:javascript
代码运行次数:0
运行
复制
ID   Name    Type1    Type2   HP  ATK   DEF
001  Bulba.. Grass    Poison  45  49    49
ect...

我想把这些数据转换成“长格式”,因为这种格式对R中的许多其他函数更友好,但我在处理Type1/Type2列时遇到了麻烦。有没有一种方法可以将这两列合并成一列(如"Type"),然后将数据转换为新格式?如下所示:

代码语言:javascript
代码运行次数:0
运行
复制
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问题。

有没有人能帮我弄清楚如何做到这一点,或者知道其他更有效的方法?

EN

回答 1

Stack Overflow用户

发布于 2019-11-10 12:12:16

1) pivot_longer整形数据帧两次,如下所示:

代码语言:javascript
代码运行次数:0
运行
复制
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")

给予:

代码语言:javascript
代码运行次数:0
运行
复制
# 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中交替使用两次。

代码语言:javascript
代码运行次数:0
运行
复制
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]

给予:

代码语言:javascript
代码运行次数:0
运行
复制
   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假设为:

代码语言:javascript
代码运行次数:0
运行
复制
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"))
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58785329

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档