在 R 中合并不均匀的面板数据帧

Merging uneven Panel Data frames in R

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

结果是 52 个变量的 0 个观测值。我已经尝试过绑定、匹配、不同版本的合并,并且搜索了我能想到的一切;但是,似乎没有什么可以专门解决这个问题。免责声明,我是 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(___)) 的输出,我不熟悉。看来,简单地擦除多余的字符会从数据集中删除整个变量。

如果您发布了您的数据(或其工作子集)以及关于您如何尝试合并的更多详细信息,这将有所帮助,但如果我理解您正在尝试做什么,您需要每个最终数据记录每个球员在特定日期的个人统计数据,然后是该球员所在球队在该日期的统计数据。在这种情况下,你应该在 Player table 中有一个 team 列来标识玩家的团队,然后通过设置 by= 合并中的属性:

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

数据帧长度不同这一事实并不重要——这正是 join/merge 操作的目的。

对于 merge() 的替代方法,您可以在 https://cran.r-project.org/web/packages/dplyr/vignettes/two-table.html

查看 dplyr 包连接函数