合并R

时间:2016-03-25 04:19:36

标签: r merge match bind panel-data

我想要合并两组面板数据。问题在于,对于每个相应的时间间隔,链接两个数据集的变量在第一数据帧中比在第二数据帧中更频繁地出现。我的目标是将第二个数据集中的每一行添加到第一个数据集中的相应行,即使这需要在同一时间间隔内多次复制所述行。具体来说,我正在研究NBA的篮球数据。第一个数据集是Player和Date的面板,而第二个是Team(Tm)和Date之一。因此,每个团队条目应该每个日期复制多次,对于该团队当天玩的每个玩家一次。我可以在excel中轻松完成此操作,但数据框太大了。

结果是对52个变量的0次观察。我已经尝试过bind,match,不同版本的merge,我搜索了我能想到的一切;但是,似乎没有什么能够具体解决这个问题。免责声明,我是R的新手。

这是我的代码,直到我的路障:

HGwd = "~/Documents/Fantasy/Basketball"
library(plm)
library(mice)
library(VIM)
library(nnet)
library(tseries)
library(foreign)
library(ggplot2)
library(truncreg)
library(boot)
Pdata = read.csv("2015-16PlayerData.csv", header = T)
attach(Pdata)
Pdata$Age = as.numeric(as.character(Pdata$Age))
Pdata$Date = as.Date(Pdata$Date, '%m/%e/%Y')
names(Pdata)[8] = "OppTm"
Pdata$GS = as.factor(as.character(Pdata$GS))
Pdata$MP = as.numeric(as.character(Pdata$MP))
Pdata$FG = as.numeric(as.character(Pdata$FG))
Pdata$FGA = as.numeric(as.character(Pdata$FGA))
Pdata$X2P = as.numeric(as.character(Pdata$X2P))
Pdata$X2PA = as.numeric(as.character(Pdata$X2PA))
Pdata$X3P = as.numeric(as.character(Pdata$X3P))
Pdata$X3PA = as.numeric(as.character(Pdata$X3PA))
Pdata$FT = as.numeric(as.character(Pdata$FT))
Pdata$FTA = as.numeric(as.character(Pdata$FTA))
Pdata$ORB = as.numeric(as.character(Pdata$ORB))
Pdata$DRB = as.numeric(as.character(Pdata$DRB))
Pdata$TRB = as.numeric(as.character(Pdata$TRB))
Pdata$AST = as.numeric(as.character(Pdata$AST))
Pdata$STL = as.numeric(as.character(Pdata$STL))
Pdata$BLK = as.numeric(as.character(Pdata$BLK))
Pdata$TOV = as.numeric(as.character(Pdata$TOV))
Pdata$PF = as.numeric(as.character(Pdata$PF))
Pdata$PTS = as.numeric(as.character(Pdata$PTS))
PdataPD = plm.data(Pdata, index = c("Player", "Date"))
attach(PdataPD)
Tdata = read.csv("2015-16TeamData.csv", header = T)
attach(Tdata)
Tdata$Date = as.Date(Tdata$Date, '%m/%e/%Y')
names(Tdata)[3] = "OppTm"
Tdata$MP = as.numeric(as.character(Tdata$MP))
Tdata$FG = as.numeric(as.character(Tdata$FG))
Tdata$FGA = as.numeric(as.character(Tdata$FGA))
Tdata$X2P = as.numeric(as.character(Tdata$X2P))
Tdata$X2PA = as.numeric(as.character(Tdata$X2PA))
Tdata$X3P = as.numeric(as.character(Tdata$X3P))
Tdata$X3PA = as.numeric(as.character(Tdata$X3PA))
Tdata$FT = as.numeric(as.character(Tdata$FT))
Tdata$FTA = as.numeric(as.character(Tdata$FTA))
Tdata$PTS = as.numeric(as.character(Tdata$PTS))
Tdata$Opp.FG = as.numeric(as.character(Tdata$Opp.FG))
Tdata$Opp.FGA = as.numeric(as.character(Tdata$Opp.FGA))
Tdata$Opp.2P = as.numeric(as.character(Tdata$Opp.2P))
Tdata$Opp.2PA = as.numeric(as.character(Tdata$Opp.2PA))
Tdata$Opp.3P = as.numeric(as.character(Tdata$Opp.3P))
Tdata$Opp.3PA = as.numeric(as.character(Tdata$Opp.3PA))
Tdata$Opp.FT = as.numeric(as.character(Tdata$Opp.FT))
Tdata$Opp.FTA = as.numeric(as.character(Tdata$Opp.FTA))
Tdata$Opp.PTS = as.numeric(as.character(Tdata$Opp.PTS))
TdataPD = plm.data(Tdata, index = c("OppTm", "Date"))
attach(TdataPD)
PD = merge(PdataPD, TdataPD, by = "OppTm", all.x = TRUE)
attach(PD)

非常感谢任何有关如何做到这一点的帮助!

修改

我从昨晚开始调整了一下,但似乎仍然没有做到这一点。请参阅上面的更新代码,了解我目前正在使用的内容。

这是head(PdataPD)的输出:

    Player       Date   Rk Pos  Tm X..H OppTm W.L GS MP FG FGA   FG. X2P
22408 Aaron Brooks 2015-10-27  817   G CHI        CLE   W  0 16  3   9 0.333   3
22144 Aaron Brooks 2015-10-28  553   G CHI    @   BRK   W  0 16  5   9 0.556   3
21987 Aaron Brooks 2015-10-30  396   G CHI    @   DET   L  0 18  2   6 0.333   1
21456 Aaron Brooks 2015-11-01 4687   G CHI        ORL   W  0 16  3  11 0.273   3
21152 Aaron Brooks 2015-11-03 4383   G CHI    @   CHO   L  0 17  5   8 0.625   1
20805 Aaron Brooks 2015-11-05 4036   G CHI        OKC   W  0 13  4   8 0.500   3
      X2PA  X2P. X3P X3PA  X3P. FT FTA FT. ORB DRB TRB AST STL BLK TOV PF PTS GmSc
22408    8 0.375   0    1 0.000  0   0  NA   0   2   2   0   0   0   2  1   6 -0.9
22144    3 1.000   2    6 0.333  0   0  NA   0   1   1   3   1   0   1  4  12  8.5
21987    2 0.500   1    4 0.250  0   0  NA   0   4   4   4   0   0   0  1   5  5.2
21456    6 0.500   0    5 0.000  0   0  NA   2   1   3   1   1   1   1  4   6  1.0
21152    3 0.333   4    5 0.800  0   0  NA   0   0   0   4   1   0   0  4  14 12.6
20805    5 0.600   1    3 0.333  0   0  NA   1   1   2   0   0   0   0  1   9  5.6
       FPTS H.A
22408  7.50   H
22144 20.25   A
21987 16.50   A
21456 14.75   H
21152 24.00   A
20805 12.00   H

头部(TdataPD):

    OppTm       Date  Rk X Opp    Result  MP FG FGA   FG. X2P X2PA  X2P. X3P X3PA
2105   ATL 2015-10-27  71   DET  L 94-106 240 37  82 0.451  29   55 0.527   8   27
2075   ATL 2015-10-29  41 @ NYK W 112-101 240 42  83 0.506  32   59 0.542  10   24
2047   ATL 2015-10-30  13   CHO   W 97-94 240 36  83 0.434  28   60 0.467   8   23
2025   ATL 2015-11-01 437 @ CHO   W 94-92 240 37  88 0.420  30   59 0.508   7   29
2001   ATL 2015-11-03 413 @ MIA   W 98-92 240 37  90 0.411  30   69 0.435   7   21
1973   ATL 2015-11-04 385   BRK  W 101-87 240 37  76 0.487  29   54 0.537   8   22
      X3P. FT FTA   FT. PTS Opp.FG Opp.FGA Opp.FG. Opp.2P Opp.2PA Opp.2P. Opp.3P
2105 0.296 12  15 0.800  94     37      96   0.385     25      67   0.373     12
2075 0.417 18  26 0.692 112     38      93   0.409     32      64   0.500      6
2047 0.348 17  22 0.773  97     36      88   0.409     24      58   0.414     12
2025 0.241 13  14 0.929  94     32      86   0.372     18      49   0.367     14
2001 0.333 17  22 0.773  98     38      86   0.442     33      58   0.569      5
1973 0.364 19  24 0.792 101     36      83   0.434     31      62   0.500      5
     Opp.3PA Opp.3P. Opp.FT Opp.FTA Opp.FT. Opp.PTS
2105      29   0.414     20      26   0.769     106
2075      29   0.207     19      21   0.905     101
2047      30   0.400     10      13   0.769      94
2025      37   0.378     14      15   0.933      92
2001      28   0.179     11      16   0.688      92
1973      21   0.238     10      13   0.769      87

如果有办法截断dput(head(___))的输出,我不熟悉它。看起来简单地删除多余的字符会从数据集中删除整个变量。

1 个答案:

答案 0 :(得分:1)

如果您发布了数据(或其中的一个工作子集)以及有关如何尝试合并的更多细节,这将有所帮助,但如果我了解您要执行的操作,则需要每个最终数据记录到在特定日期为每位球员提供个人统计数据,然后是该球员在该日期的统计数据。在这种情况下,您应该在Player表中有一个team列来标识玩家的团队,然后通过设置by=属性来加入复合键Date和Team上的两个表在合并中:

merge(PData, TData, by=c("Date", "Team")) 

数据帧长度不同并不重要 - 这正是加入/合并操作的目的。

对于merge()的替代方法,您可以查看https://cran.r-project.org/web/packages/dplyr/vignettes/two-table.html处的dplyr包连接函数