2016-03-25 16 views
1

Ich habe zwei Sätze von Panel-Daten, die ich zusammenführen möchte. Das Problem besteht darin, dass für jedes entsprechende Zeitintervall die Variable, die die zwei Datensätze verbindet, im ersten Datenrahmen häufiger auftritt als im zweiten. Mein Ziel ist es, jede Zeile aus dem zweiten Datensatz in die entsprechende Zeile des ersten Datensatzes einzufügen, auch wenn das mehrfache Kopieren der Zeile im selben Zeitintervall erforderlich macht. Insbesondere arbeite ich mit Basketballdaten von der NBA. Der erste Datensatz besteht aus einem Bereich aus Player und Datum, der zweite aus Team (Tm) und Datum. Daher sollte jeder Team-Eintrag mehrmals pro Datum kopiert werden, einmal für jeden Spieler des Teams, der an diesem Tag gespielt hat. Ich könnte dies leicht in Excel machen, aber die Datenrahmen sind zu groß.Verschachteln von unebenen Panel-Datenrahmen in R

Das Ergebnis ist 0 Beobachtungen von 52 Variablen. Ich habe mit Bind, Match, verschiedenen Versionen von Merge experimentiert und nach allem gesucht, was mir einfällt; aber nichts scheint dieses Problem spezifisch anzugehen. Haftungsausschluss, ich ist sehr neu für R.

Hier ist mein Code, bis meine Straßensperre:

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) 

Jede Hilfe, wie dies zu tun, wäre sehr dankbar!

EDIT

ich habe ein wenig von der letzten Nacht gezwickt, aber immer noch nichts scheint den Trick zu tun. Siehe den obigen, aktualisierten Code für das, was ich gerade benutze.

Hier ist die Ausgabe für Kopf (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 

Und für Kopf (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 

Wenn es Art und Weise die Ausgabe von dput (Kopf (___) trunkieren), Ich kenne mich damit nicht aus. Es scheint, dass das einfache Löschen der überschüssigen Zeichen ganze Variablen aus dem Datensatz entfernen würde.

+2

Funktionen überprüfen Es ist einfacher, für andere zu helfen, wenn Sie Ihre aktuellen Daten veröffentlichen. Anstelle des gesamten Codes, den Sie verwendet haben, ändern Sie Ihre Frage so, dass die Ausgabe von 'dput (head (PdataPD))' und 'dput (head (TdataPD))' – SymbolixAU

+1

Und Sie müssen ihm sagen, was zu 'merge »weiter. Ich denke, du bist nach 'PD <- merge (PdataPD, tdataPD, durch =" Datum ", all.x = TRUE)' – SymbolixAU

+0

Es lässt mich nicht zeigen Sie irgendwelche der Ausgabeausgaben; sie sind zu lang. Jedoch PD = Zusammenführen (PdataPD, TdataPD, durch = "Datum", all.x = TRUE) kam zurück: Warnmeldungen: 1: In .HTMLsearch (Abfrage): Unbekanntes Suchfeld: Titel 2:.HTMLsearch (query): Unbekanntes Suchfeld: Stichwort 3: In .HTMLsearch (query): Unbekanntes Suchfeld: alias Es scheint, als habe es umgekehrt funktioniert, indem jeder Spieler mehrfach für jedes Datum zu jedem Spiel kopiert wurde , anstatt jedes Spiel mehrere Male für jeden Spieler für ein bestimmtes Datum zu kopieren. –

Antwort

1

Es wäre hilfreich, wenn Sie Ihre Daten (oder eine funktionierende Teilmenge davon) und ein wenig mehr Details darüber, wie Sie versuchen, zu verschmelzen, aber wenn ich verstehe, was Sie versuchen, wollen Sie jeden endgültigen Datensatz individuelle Statistiken für jeden Spieler an einem bestimmten Datum haben, gefolgt von den Statistiken des Spielers für dieses Datum. In diesem Fall sollten Sie eine team Spalte in der Spieler-Tabelle, die den Spieler Team identifiziert, und dann die beiden Tabellen auf dem zusammengesetzten Schlüssel Datum und Team beitreten, indem der by= Attribut in merge:

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

Die Tatsache, dass die Datenrahmen unterschiedlich lang sind, spielt keine Rolle - genau dafür stehen Join/Merge-Operationen.

Für eine Alternative zu fusionieren(), könnte man das dplyr Paket beitreten bei https://cran.r-project.org/web/packages/dplyr/vignettes/two-table.html

+0

Ich möchte eigentlich die Teamstatistiken seines Gegners für dieses Datum, aber sonst, ja, genau das versuche ich. Du hast es gelöst! Ich musste die allgemeine Variable erstellen, aber mit Datum in der by() -Funktion, was war der Trick! Ich danke dir sehr! –

+0

Wenn Sie nicht bereits sehen können, wohin ich damit gehe, ist meine nächste Frage, wie Sie eine Variable nacheilen? Jedes Mal, wenn ich die Funktion lag() verwende, scheint sie es einfach zu kopieren. –

+0

Sie sollten wahrscheinlich einen neuen Beitrag zu SO erstellen, da dies eine separate Frage ist, aber die Funktion lag() die ursprüngliche Variable nicht überschreibt, es sei denn, Sie weisen sie explizit neu zu. Wenn Sie die Variable 'var = c (1, 2, 3)' haben und wollen, dass 'var' die verzögerte Version von sich selbst ist:' var <- lag (var) ' – Nat

Verwandte Themen