合并具有不同行数的data.frames

时间:2015-08-03 04:27:06

标签: r

我有7个带有运动统计数据的大数据框架。它们具有不同的行数和不同的列数,但是一些列具有相似的值(游戏ID,玩家ID,因此我创建了game_player_id来合并它们)。在这些数据框架中,有些行不存在(玩家没有玩过),而在其他行中它们存在,因为这些玩家被列为DNP。我想将这7个帧与所有玩家合并为一个大(有效而非有效)。 merge()适用于具有相同行数的帧,但在我尝试运行函数时它并不适用。结果我只得到了列名和

  

< 0行> (或0长度的row.names)

GAME_PLAYER_ID MIN AST
001001         86  1
001002         90  0
001003         30  0
001004         0   DNP
001005         90  2

GAME_PLAYER_ID MIN PASS
001001         86  25
001002         90  45
001003         30  25
001005         90  39

预期结果

GAME_PLAYER_ID MIN AST PASS
001001         86  1   25
001002         90  0   45
001003         30  0   25
001004         DNP   DNP DNP/NA (whatever but not 0)
001005         90  2   39

问题出在哪里?如何以简单的方式做到这一点?我可能会编写一个函数,但它会很复杂(很多行,每个data.frame都有20多列),有没有可以帮我处理这些的软件包?

1 个答案:

答案 0 :(得分:2)

您想要执行完整外部加入:What is the difference between "INNER JOIN" and "OUTER JOIN"?

> df1 = read.table(header = TRUE, text = 
+ "GAME_PLAYER_ID MIN AST
+ 001001         86  1
+ 001002         90  0
+ 001003         30  0
+ 001004         0   DNP
+ 001005         90  2")
> 
> df2 = read.table(header = TRUE, text = 
+ "GAME_PLAYER_ID MIN PASS
+ 001001         86  25
+ 001002         90  45
+ 001003         30  25
+ 001005         90  39")
> 
> df3 = merge(df1, df2, all = TRUE)
> df3
  GAME_PLAYER_ID MIN AST PASS
1           1001  86   1   25
2           1002  90   0   45
3           1003  30   0   25
4           1004   0 DNP   NA
5           1005  90   2   39

这会将NA放入未由输入数据帧填充的任何单元格中。为了将来的参考,我已经多次回答这个问题:How to join (merge) data frames (inner, outer, left, right)?