Fusion d'erreur : longueur négative vecteurs ne sont pas autorisés
J'ai essayé de fusionner les deux de données.les cadres, 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 de 1 048 575 lignes. Mon code est merge(a,b,by=c("GVKEY","YEAR"))
, je continue de recevoir des message d'erreur "negative length vectors are not allowed
". J'ai aussi essayé les données.table façon, mais j'ai reçu un message d'erreur indiquant que mes résultats dépassant 2^31 lignes. Apparemment, la fusion de données ne sera pas si grande, si je ne suis pas sûr de la façon de résoudre ce problème.
- Avez-vous des doublons pour les
by
colonnes dans les deux ensembles de données? - stackoverflow.com/questions/36842263/... Il semble y avoir un problème de mémoire. stat.ethz.ch/pipermail/r-help/2015-January/425051.html
- essayez
nrow(duplicated(a[,c("GVKEY","YEAR")])
etnrow(duplicated(b[,c("GVKEY","YEAR")])
pour compter le nombre de lignes avec des doubles de clés - Vous avez raison, l'une des données a des doublons pour les par colonne
Vous devez vous connecter pour publier un commentaire.
Vous obtenez cette erreur, parce que le
data.frame
/data.table
créé par la jointure a plus de2^31 - 1
lignes (de 2 147 483 647).En raison de la façon dont les vecteurs sont construits en interne par R, la longueur maximale de chaque vecteur est
2^31 - 1
éléments (voir: https://stackoverflow.com/a/5234293/2341679). Depuis undata.frame
/data.table
est vraiment unlist()
de vecteurs, cette limite s'applique également au nombre de lignes.Que d'autres gens ont commenté et a répondu, malheureusement, vous ne serez pas en mesure de construire cette
data.table
, et ses il est probable que de nombreuses lignes en raison de dupliquer les correspondances entre vos deuxdata.tables
(qui peut ou peut ne pas être intentionnelle de votre part).La bonne nouvelle est que, si les doublons matchs sont pas erreurs, et vous souhaitez effectuer la jointure, il y a un moyen de contourner cela: vous avez juste besoin de faire ce calcul que tu voulais faire sur la
data.table
dans le même appel que la jointure à l'aide de ladata.table[]
opérateur,e.g.
:Si vous n'êtes pas familier avec le
data.table
syntaxe, vous pouvez effectuer des calculs sur des colonnes à l'intérieur d'undata.table
comme indiqué ci-dessus à l'aide de laj
argument. Lors de l'exécution d'une jointure à l'aide de cette syntaxe, le calcul enj
est effectuée sur ladata.table
créé par la jointure.La clé ici est la
by = .EACHI
argument. Cela rompt la jointure et la suite du calcul dansj
) en petits éléments: l'undata.table
pour chaque ligne dedt_right
et ses matches dansdt_left
, en évitant le problème de la création d'undata.table
avec >2^31 - 1
lignes.Je ne suis pas sûr de savoir comment
merge
est mis en œuvre, mais il semble y avoir une grande différence lorsque vous essayez de fusionner en une seule colonne ou par deux, comme vous pouvez le voir dans la simulation suivante:À la recherche à la mémoire du système les deux colonnes de fusion utilisé beaucoup plus de mémoire. Il y a probablement un produit cartésien, quelque part, et je suppose que c'est ce qui est la cause de votre erreur.
Ce que vous pourriez faire est de créer une nouvelle colonne de la concaténation de GVKEY et l'ANNÉE pour chacune des données.cadre et de fusion en fonction de cette colonne.
Vous devez nettoyer les colonnes dans le résultat, depuis GVKEY et l'ANNÉE permettrait à la fois de comparaître deux fois, mais au moins, la fusion devrait fonctionner.
J'ai eu le même problème lors de l'exécution d'une tâche dans la r semblables recherchev présents dans MS Excel. Cette erreur est là parce que votre clé de colonne n'est pas assez bon pour mapper les données d'une table vers une autre table. Mieux de supprimer les zéros ou de faire une colonne unique, comme expliqué par @Assaf Laine. J'espère que ça aidera!