2017-02-27 2 views
2

ich zwei data.frames zu verschmelzen versucht, und sie sind wie folgt:Merge-Fehler: negative Länge Vektoren sind nicht erlaubt

GVKEY YEAR coperol  delta  vega firm_related_wealth 
1 001045 1992  1 38.88885 17.86943   2998.816 
2 001045 1993  1 33.57905 19.19287   2286.418 
3 001045 1994  1 48.54719 16.85830   3924.053 
4 001045 1995  1 111.46762 38.71565   8550.903 
5 001045 1996  1 218.89279 45.59413   17834.921 
6 001045 1997  1 415.61461 51.45863   34279.515 

UND

GVKEY YEAR fracdirafter fracdirafterindep twfracdirafter 
1 001004 1996   1.00    0.70 1.000000000 
2 001004 1997   0.00    0.00 0.000000000 
3 001004 1998   0.00    0.00 0.000000000 
4 001004 1999   0.00    0.00 0.000000000 
5 001004 2000   0.00    0.00 0.000000000 
6 001004 2001   0.25    0.25 0.009645437 

Sie haben beide 1.048.575 Zeilen. Mein Code ist merge(a,b,by=c("GVKEY","YEAR")), ich erhielt immer die Fehlermeldung "negative length vectors are not allowed". Ich versuchte auch die data.table Weise, aber erhielt Fehlermeldung, dass meine Ergebnisse 2^31 Zeilen überschreiten würden. Offensichtlich werden die zusammengeführten Daten nicht so groß sein, also bin ich mir nicht sicher, wie ich dieses Problem lösen soll.

+1

Haben Sie Duplikate für die 'by'-Spalten in beiden Datensätzen? – akrun

+0

http://stackoverflow.com/questions/36842263/memory-limits-in-data-table-negative-length-vectors-are-not-allowed Es scheint ein Speicherproblem zu sein. https://stat.ethz.ch/pipermail/r-help/2015-Januar/425051.html – jogo

+0

versuchen Sie 'nrow (dupliziert (a [, c (" GVKEY "," YEAR ")]) und' nrow (dupliziert (b [, c ("GVKEY", "YEAR")]), um die Anzahl der Zeilen mit doppelten Schlüsseln zu zählen – OdeToMyFiddle

Antwort

-1

Ich bin nicht sicher, wie merge implementiert ist, aber es scheint einen großen Unterschied zu sein, wenn Sie versuchen, eine Spalte oder zwei zu fusionieren, wie Sie in der folgenden Simulation sehen:

> df1<-data.frame(a=1:200000,b=2*(1:200000),c=3*(1:200000)) 
> df2<-data.frame(a=-df1$a,b=-df1$b,d=4*(1:200000)) 
> ss<-sample(200000,10000) 
> df2[ss,1:2]<-df1[ss,1:2] 
> system.time(df3<-merge(x=df1,y=df2,by=c('a','b'))) 
user system elapsed 
1.25 0.00 1.25 
> system.time(df4<-merge(x=df1,y=df2,by='a')) 
user system elapsed 
0.06 0.00 0.06 

Mit Blick auf den Systemspeicher nutzte die zweispaltige Zusammenführung auch viel mehr Speicher. Da ist wahrscheinlich irgendwo ein kartesisches Produkt drin und ich schätze, das ist der Grund für Ihren Fehler.

Sie können eine neue Spalte erstellen, die GVKEY und YEAR für jedes data.frame verkettet und nach dieser Spalte zusammenführt.

a$newKey<-paste(a$GVKEY,a$YEAR,sep='_') 
b$newKey<-paste(b$GVKEY,b$YEAR,sep='_') 
c<-merge(a,b,by='newKey') 

Sie müßten die Spalten im Ergebnis bereinigen, da GVKEY und YEAR beide zweimal erscheinen würden, aber zumindest sollte die Zusammenführung arbeiten.

0

Ich hatte das gleiche Problem beim Ausführen einer Aufgabe in r ähnlich vlookup in MS Excel. Dieser Fehler ist vorhanden, weil Ihre Schlüsselspalte nicht gut genug ist, um Daten aus einer Tabelle einer anderen Tabelle zuzuordnen. Entfernen Sie besser Nullen oder machen Sie eine Spalte einzigartig, wie von @Assaf Wool erklärt. Hoffe es wird helfen!

0

Sie erhalten diesen Fehler, weil die data.frame/data.table erstellt von der Verknüpfung mehr als 2^31 - 1 Zeilen (2.147.483.647) hat.

Aufgrund der Art, wie Vektoren intern von R konstruiert werden, ist die maximale Länge eines Vektors 2^31 - 1 Elemente (siehe: https://stackoverflow.com/a/5234293/2341679). Da ein data.frame/data.table wirklich ein list() von Vektoren ist, gilt diese Grenze auch für die Anzahl der Zeilen.

Wie andere Leute haben kommentiert und beantwortet, leider wird es nicht möglich sein, diese data.table zu konstruieren, und seine wahrscheinlich gibt es, dass viele Zeilen wegen doppelter Übereinstimmungen zwischen Ihren beiden data.tables (diese können oder nicht beabsichtigt sein kann, auf dem Teil).

Die gute Nachricht ist, wenn die doppelten Übereinstimmungen sind nicht Fehler, und Sie wollen immer noch die Verbindung auszuführen, gibt es eine Möglichkeit, um es: Sie brauchen nur zu tun, was die Berechnung Sie data.table auf der resultierende tun wollte im gleichen Anruf wie die Verbindung mit dem data.table[] Operator, e.g.:

dt_left[dt_right, on = .(GVKEY, YEAR), 
     j = .(sum(firm_related_wealth), mean(fracdirafterindep), 
     by = .EACHI] 

Wenn Sie nicht vertraut mit der data.table Syntax sind, können Sie Berechnungen auf Spalten innerhalb einer data.table ausführen, wie oben unter Verwendung des j Argument gezeigt. Wenn Sie einen Join mit dieser Syntax ausführen, wird die Berechnung in j für den durch den Join erstellten Wert data.table ausgeführt.

Der Schlüssel hier ist das by = .EACHI Argument. Dies unterbricht die Verbindung (und nachfolgende Berechnung in j) in kleinere Komponenten: ein data.table für jede Zeile in dt_right und ihre Übereinstimmungen in dt_left, die Vermeidung des Problems der ein data.table mit>2^31 - 1 Reihen zu schaffen.

Verwandte Themen