bind_rows dans dplyr jeter d'erreur inhabituels
J'espère que je ne suis pas la duplication de certains déjà existants question. Je suis en train de travailler sur une version 32 bits de Win7 machine, R V=3.2.0, dplyr V=0.4.1, RStudio 0.98.1103.
Les fichiers en question sont deux fichiers CSV lire dans le var (x,y /sep = "|", header = TRUE, stringsasFactors = FALSE), qui proviennent de la même table Oracle. La requête utilisée pour produire à la fois des fichiers tiré exactement les mêmes variables (29).
identical(names(x), names(y) > TRUE
Cependant, lorsque je charge le dplyr paquet et essayez d'utiliser 'bind_rows" comme dat <- bind_rows(x, y), je reçois le message d'erreur suivant:
> bind_rows(x,y)
Error: incompatible type (data index: 2, column: 'rmnumber', was collecting: integer (dplyr::Collecter_Impl<13>), incompatible with data of type: factor
In addition: Warning messages:
1: In rbind_all(list(x, ...)) :
Unequal factor levels: coercing to character
2: In rbind_all(list(x, ...)) :
Unequal factor levels: coercing to character
3: In rbind_all(list(x, ...)) :
Unequal factor levels: coercing to character
J'ai regardé la colonne 'rmnumber" et a vérifié que tout dans cette colonne est un numérique comme prévu ou "NA", comme il est également prévu pour les valeurs NULL dans la table. J'ai aussi essayé bind_rows(liste(x,y)) et il a renvoyé la même erreur.
La primitive "rbind" fonctionne très bien sur ces variables sans perte notable de la précision.
Quelqu'un a vu cette erreur? Avez-vous des solutions possibles en dehors de l'utilisation de rbind?
Merci!
#
Je ne pense pas que ce soit utile, mais j'ai construit mon propre dfs et des cours "bind_rows' a fonctionné parfaitement:
> x.df <- data.frame(first_name = c("abc"), last_name = c("def"), rmnum = (1:15), addy = ("some_address"))
> y.df <- data.frame(first_name = c("abc"), last_name = c("def"), rmnum = (1:15), addy = ("some_address"))
> bind_rows(x.df, y.df)
Source: local data frame [30 x 4]
first_name last_name rmnum addy
1 abc def 1 some_address
2 abc def 2 some_address
3 abc def 3 some_address
4 abc def 4 some_address
5 abc def 5 some_address
6 abc def 6 some_address
7 abc def 7 some_address
8 abc def 8 some_address
9 abc def 9 some_address
10 abc def 10 some_address
.. ... ... ... ...
Vérification de la classe de cols
> identical(sapply(x, class), sapply(y, class))
[1] FALSE
> class(x$rmnumber);class(y$rmnumber)
[1] "integer"
[1] "character"
Ce que je ne peut pas comprendre est pourquoi ils sont différents. L'information est apparue hors de l'exact même table et qu'ils ont lu dans des variables en utilisant exactement le même code.
De verrouillage dans la solution
Grand merci à @Pascal pour m'aider à résoudre ce problème. Une simple conversion de type de données résolu mon problème:
y$rmnumber <- as.integer(y$rmnumber)
> dat2 <- bind_rows(x,y)
> dat2
Source: local data frame [99,884 x 24]
Permettez-moi de voir si je peux trouver un similaire reproductible exemple. Désolé de ne pas y compris.
rbindlist
de données.table des poignées de facteurs froid avec de l'inégalité des niveaux et le caractère cols automatiquement... Peut-être la peine de vérifier.excellent commentaire. Vous devez l'ajouter comme une réponse. C'est une bien meilleure solution pour certaines personnes (comme moi) qui sont aux prises avec une tonne de variables qui sont incompatibles.
OriginalL'auteur Zach | 2015-05-12
Vous devez vous connecter pour publier un commentaire.
Les messages d'erreur dit que: "dans l'une de données.cadre, 'rmnumber" dans de la classe integer, et dans les autres données.cadre, 'rmnumber' est de classe facteur. Je ne peut pas lier les différentes classes d'ensemble".
Prenons votre exemple
Nous vérifions la classe pour chaque colonne de x.df" et "y.df":
Tout est beau, les classes entre les données.les cadres sont cohérentes. Maintenant, tournons-nous "y.df$rmnum" en facteur:
Essayons de lier maintenant:
Même message d'erreur. Ainsi, dans l'un de vos données.cadre, 'rmnumber' est entier et dans l'autre, 'rmnumber" est un facteur. Vous devez activer le compte 'rmnumber" en entier, ou l'inverse.
J'ai confirmé que rmnumber (x, y) sont effectivement différentes. Qu'est-ce que wozzy est que lorsque j'ai essayé d'y$rmnumber <- entier(y$rmnumber) j'ai une erreur qui dit invalide la longueur de l'argument.
À son tour facteur en entier/numérique: stackoverflow.com/a/3418192/3710546
Boo yah! @Pascal -- gagnant, gagnant, un dîner de poulet!
bind_rows() devrait faire face à ces erreurs en modifiant les deux colonnes de caractère.
OriginalL'auteur