【问题标题】:Merging uneven Panel Data frames in R在 R 中合并不均匀的面板数据帧
【发布时间】:2016-07-12 20:30:56
【问题描述】:

我有两组想要合并的面板数据。问题在于,对于每个相应的时间间隔,链接两个数据集的变量在第一个数据帧中出现的频率比在第二个数据帧中出现的频率更高。我的目标是将第二个数据集中的每一行添加到第一个数据集中的相应行,即使这需要在同一时间间隔内多次复制所述行。具体来说,我正在处理来自 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(___)) 的输出,我不熟悉它。看来,简单地删除多余的字符会从数据集中删除整个变量。

【问题讨论】:

  • 如果您发布您的实际数据,其他人会更容易提供帮助。而不是您用来创建它的所有代码,而是更改您的问题以包含 dput(head(PdataPD))dput(head(TdataPD)) 的输出
  • 而且,您需要告诉它merge 上的内容。我想你在PD <- merge(PdataPD, tdataPD, by="Date", all.x=TRUE)
  • 它不会让我向您展示任何 dput 输出;它们太长了。但是,PD = merge(PdataPD, TdataPD, by = "Date", all.x = TRUE) 回来了:警告消息:1:在 .HTMLsearch(query) 中:无法识别的搜索字段:标题 2:在 .HTMLsearch(query) : Unrecognized search field: keyword 3: In .HTMLsearch(query) : Unrecognized search field: alias 它似乎在反向工作,通过将每个玩家多次复制到给定日期的每个游戏,而不是在给定日期将每个游戏多次复制给每个玩家。
  • all.x=TRUE 换成all.y=TRUE
  • 所做的只是将每个玩家多次复制到同一日期。

标签: r merge match bind panel-data


【解决方案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 包连接函数

【讨论】:

  • 我实际上想要他的对手在那一天的球队统计数据,但是,否则是的,这就是我想要做的。你解决了!我必须创建公共变量,但是在 by() 函数中将它与 Date 一起包括在内是诀窍!非常感谢!
  • 如果您还看不到我的目标,我的下一个问题是如何滞后变量?每次我使用 lag() 函数时,它似乎只是复制它。
  • 您可能应该在 SO 上创建一个新帖子,因为这是一个单独的问题,但 lag() 函数不会覆盖原始变量,除非您明确重新分配它。如果您有变量 var=c(1, 2, 3) 并且您希望 var 成为其自身的滞后版本:var <- lag(var)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-06-11
  • 1970-01-01
  • 2021-10-07
  • 2023-03-05
  • 1970-01-01
  • 1970-01-01
  • 2014-04-04
相关资源
最近更新 更多