尝试从长格式转换为宽格式,但最终以变量的每种组合结束
Trying to convert from long to wide format but ending up with every combination of variable
我想从这个结构开始:
game_id team pts
1 400597848 TOWS 53
2 400597848 COFC 50
3 400595519 ILL 49
4 400595519 WIS 68
为此:
game_id team1 pts1 team2 pts2
1 400597848 TOWS 53 COFC 50
3 400595519 ILL 49 WIS 68
示例数据如下:
d <- structure(list(game_id = c(400597848L, 400597848L, 400595519L,
400595519L), team = c("TOWS", "COFC", "ILL", "WIS"), pts = c(53L,
50L, 49L, 68L)), .Names = c("game_id", "team", "pts"), row.names = c(NA,
4L), class = "data.frame")
我试过使用 tidyr
并遵循了本教程:
http://www.cookbook-r.com/Manipulating_data/Converting_data_between_wide_and_long_format/
然而,当我尝试时:
spread(d, team, pts)
我得到所有团队的重复列,但不想要所有组合。
1. data.table
我们可以使用 data.table
的开发版本中的 dcast
,即 v1.9.5
,它可以包含多个 'value.var' 列。它可以从 here
安装。
将 'data.frame' 转换为 'data.table' (setDT(d)
),创建序列列 ('ind'),按 'game_id' 分组,然后使用 dcast
在修改后的数据集上指定 'value.var' 为 'team' 和 'pts'.
dcast(setDT(d)[, ind:= 1:.N, by=game_id], game_id~ind,
value.var=c('team', 'pts'))
# game_id 1_team 2_team 1_pts 2_pts
#1: 400595519 ILL WIS 49 68
#2: 400597848 TOWS COFC 53 50
2。基础 R
另一个选项是在创建 'ind' 列后使用 base R
中的 reshape
。
d1 <- transform(d, ind=ave(seq_along(game_id), game_id, FUN=seq_along))
reshape(d1, idvar='game_id', timevar='ind', direction='wide')
# game_id team.1 pts.1 team.2 pts.2
#1 400597848 TOWS 53 COFC 50
#3 400595519 ILL 49 WIS 68
我想从这个结构开始:
game_id team pts
1 400597848 TOWS 53
2 400597848 COFC 50
3 400595519 ILL 49
4 400595519 WIS 68
为此:
game_id team1 pts1 team2 pts2
1 400597848 TOWS 53 COFC 50
3 400595519 ILL 49 WIS 68
示例数据如下:
d <- structure(list(game_id = c(400597848L, 400597848L, 400595519L,
400595519L), team = c("TOWS", "COFC", "ILL", "WIS"), pts = c(53L,
50L, 49L, 68L)), .Names = c("game_id", "team", "pts"), row.names = c(NA,
4L), class = "data.frame")
我试过使用 tidyr
并遵循了本教程:
http://www.cookbook-r.com/Manipulating_data/Converting_data_between_wide_and_long_format/
然而,当我尝试时:
spread(d, team, pts)
我得到所有团队的重复列,但不想要所有组合。
1. data.table
我们可以使用 data.table
的开发版本中的 dcast
,即 v1.9.5
,它可以包含多个 'value.var' 列。它可以从 here
安装。
将 'data.frame' 转换为 'data.table' (setDT(d)
),创建序列列 ('ind'),按 'game_id' 分组,然后使用 dcast
在修改后的数据集上指定 'value.var' 为 'team' 和 'pts'.
dcast(setDT(d)[, ind:= 1:.N, by=game_id], game_id~ind,
value.var=c('team', 'pts'))
# game_id 1_team 2_team 1_pts 2_pts
#1: 400595519 ILL WIS 49 68
#2: 400597848 TOWS COFC 53 50
2。基础 R
另一个选项是在创建 'ind' 列后使用 base R
中的 reshape
。
d1 <- transform(d, ind=ave(seq_along(game_id), game_id, FUN=seq_along))
reshape(d1, idvar='game_id', timevar='ind', direction='wide')
# game_id team.1 pts.1 team.2 pts.2
#1 400597848 TOWS 53 COFC 50
#3 400595519 ILL 49 WIS 68