许多数据框架,不同的行长度,类似的列和数据框标题,如何绑定?

时间:2016-02-21 22:03:16

标签: r merge dataframe

这需要一些解释,帖子本身可能有点太长而无法回答。

我有很多个别国际象棋选手的数据框及其在时间点的特定评分。

以下是我的数据。请原谅我分离数据集的格式不佳。 Carlsen和Nakamura是独立的数据框架。

Player1

 Nakamura, Hikaru Year
             2364 2001-01-01
             2430 2002-01-01
             2520 2003-01-01
             2571 2004-01-01
             2613 2005-01-01
             2644 2006-01-01
             2651 2007-01-01
             2670 2008-01-01
             2699 2009-01-01
             2708 2010-01-01
             2751 2011-01-01
             2759 2012-01-01
             2769 2013-01-01
             2789 2014-01-01
             2776 2015-01-01
             2787 2016-01-01

Player2
          Carlsen, Magnus Year

                   2127   2002-01-01
                   2279   2003-01-01
                   2484   2004-01-01
                   2553   2005-01-01
                   2625   2006-01-01
                   2690   2007-01-01
                   2733   2008-01-01
                   2776   2009-01-01
                   2810   2010-01-01
                   2814   2011-01-01
                   2835   2012-01-01
                   2861   2013-01-01
                   2872   2014-01-01
                   2862   2015-01-01
                   2844   2016-01-01

您可以在此处下载这两套:

Download Player2 Download Player1

在上面的代码和下面的代码之间,我删除了两列,并将一个观察结果重新分配为列标题。

Hikaru Nakamura / Magnus Carlsen随时间的国际象棋评级

enter image description here enter image description here

Hikaru的数据被分配给数据帧Player1。 Magnus的数据被分配给数据帧Player2。

我想要做的就是得到你在下面看到的内容,它们的数据框合起来了。

我用来制作这个框架的代码是

 merged<- merge(Player1, Player2, by = c("Year"), all = TRUE)

enter image description here

现在,对于两个数据集来说,这一切都很有趣,但是我在为这个组合数据集添加更多玩家时遇到了非常烦人的困难。

例如,也许我想在此套装中添加5,10,15个玩家。这些球员的例子是Kramnik,Anand,Gelfand(着名国际象棋选手的例子)。正如您所期望的那样,对于5个玩家来说,数据框将有6列,10个将有11个,15个将有16个,所有这些都按年变量很好地排序。

幸运的是,每位玩家的观察次数总是少于100次。此外,每个玩家都会被分配他/她自己的数据集。

例如,

 Nakamura is the Player1 dataframe
 Carlsen is the Player2 dataframe
 Kramnik is the Player3 dataframe
 Anand is the Player4 dataframe
 Gelfand is the Player5 dataframe

我使用此代码

使用for循环分配过程创建的所有内容
for (i in 1:nrow(as.data.frame(unique(Timed_set_filtered$Name)))) {
  assign(paste("Player",i,sep=""), subset(Timed_set_filtered, Name == unique(Timed_set_filtered$Name)[i]))
}

我不想写下面的内容:

 merged<- merge(Player1, Player2,.....Player99 ,Player100, by = c("Year"), all = TRUE)

我希望能够将我在循环中创建的所有5,10,15 ... i个玩家“i”对象合并到一年。

此外,一旦它最初离开循环,每个数据集都是这样的。

enter image description here

所以最终发生的事情是我使用以下代码段将所有数据集分配到列表中:

 lst <- mget(ls(pattern='^Player\\d+'))
 list2env(lapply(lst,`[`,-2), envir =.GlobalEnv)
 lst <- mget(ls(pattern='^Player\\d+'))

for (i in 1:nrow(as.data.frame(unique(Timed_set_filtered$Name)))) {
  names(lst[[i]]) [names(lst[[i]]) == 'Rating'] <- eval(unique(Timed_set_filtered$Name)[i])
}

这就是我的清单。

enter image description here

有没有办法用YEAR写一个表作为其合并的方式,这样它[cbinds,bind_cols,merges等]每个Player“i”数据帧,必然不相等长度,在我的列表中是这样一种方式,我得到一个合并/合并集合,就像你在合并(player1,player2)集合下面看到的那样?

以下是图表,但它必须适用于许多玩家,而不仅仅是Carlsen和Nakmura。

enter image description here

另外,有没有办法可以避免使用列表功能,只需直接执行

names(Player"i") [names(Player"i") == 'Rating'] <- eval(unique(Timed_set_filtered$Name)[i])

只重命名以“播放器”开头的所有数据框的标题。

merge(player1, player2, player3,...., player99, player100, by = c("YEAR"), all = TRUE) 

会合并所有“播放器”“i”数据集吗?

如果有任何不清楚的地方,请提及。

1 个答案:

答案 0 :(得分:0)

一行代码完成了这个技巧,这很有趣。在我将所有Player1,Player 2 .... Player i分配到列表中之后,我刚刚按年份加入了列表中包含的所有集合。

用于生成所有唯一数据集的循环。

for (i in 1:nrow(as.data.frame(unique(Timed_set_filtered$Name)))) {
  assign(paste("Player",i,sep=""), subset(Timed_set_filtered, Name == unique(Timed_set_filtered$Name)[i]))
}

将它们放入列表

 lst <- mget(ls(pattern='^Player\\d+'))

合并,或按共同价值加入

df <- join_all(lst, by = 'Year')

不幸的是,与merge(datasets ....,all = TRUE)不同,它会因某个未知原因而丢弃某些观察结果,必须看看为什么会发生这种情况。