web-dev-qa-db-fra.com

Erreur de fusion: les vecteurs de longueur négative ne sont pas autorisés

J'ai essayé de fusionner deux data.frames, et ils sont comme ci-dessous:

   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

ET

   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

Ils ont tous deux 1 048 575 lignes. Mon code est merge(a,b,by=c("GVKEY","YEAR")), j'ai continué à recevoir le message d'erreur "negative length vectors are not allowed". J'ai aussi essayé la méthode data.table, mais j'ai reçu un message d'erreur disant que mes résultats dépasseraient 2 ^ 31 lignes. Apparemment, les données fusionnées ne seront pas si volumineuses, donc je ne sais pas comment résoudre ce problème.

7
Bobo

Vous obtenez cette erreur car le data.framedata.table créé par la jointure a plus de 2^31 - 1 lignes (2 147 483 647). 

En raison de la manière dont les vecteurs sont construits en interne par R, la longueur maximale de tout vecteur est de 2^31 - 1 éléments (voir: https://stackoverflow.com/a/5234293/2341679 ). Etant donné qu'un data.frame/data.table est en réalité une list() de vecteurs, cette limite s'applique également au nombre de lignes. 

Comme d'autres personnes ont commenté et répondu, vous ne pourrez malheureusement pas construire ce data.table, et il est probable qu'il y ait autant de lignes en raison de correspondances en double entre vos deux data.tables (ceux-ci peuvent ou non être intentionnels de votre part).

La bonne nouvelle est que, si les correspondances en double sont des erreurs _/not et que vous souhaitez toujours effectuer la jointure, il existe un moyen de contourner le problème: vous devez simplement effectuer le calcul que vous souhaitez faire sur le data.table résultant dans la même appel que la jointure à l’aide de l’opérateur data.table[], e.g.:

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

Si vous ne connaissez pas la syntaxe data.table, vous pouvez effectuer des calculs sur les colonnes dans un data.table comme indiqué ci-dessus à l'aide de l'argument j. Lors de l'exécution d'une jointure à l'aide de cette syntaxe, le calcul dans j est effectué sur le data.table créé par la jointure. 

La clé ici est l'argument by = .EACHI. Cela décompose la jointure (et le calcul ultérieur dans j) en composants plus petits: un data.table pour chaque ligne dans dt_right et ses correspondances dans dt_left, évitant ainsi le problème de la création d'un data.table avec> 2^31 - 1 lignes. 

6
Scott Ritchie

J'ai eu le même problème lors de l'exécution d'une tâche similaire à celle de vlookup présente dans MS Excel. Cette erreur existe car votre colonne de clé n'est pas assez bonne pour mapper les données d'une table à une autre. Supprimez les zéros ou créez une colonne unique, comme expliqué par @Assaf Wool. J'espère que ça va aider!

0
Mayur Mane