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.
Vous obtenez cette erreur car le data.frame
data.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.
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!