Enlever les étiquettes variables attachées aux fonctions d'importation étrangères / Hmisc SPSS
Question
Comme d'habitude, je suis arrivé quelques fichiers SPSS que j'ai importé en R avec la fonction spss.get
du paquet Hmisc
. Je suis tracassé avec classe labelled
que Hmisc::spss.get
ajoute à toutes les variables data.frame
, veux donc de le supprimer.
classe labelled
me donne des maux de tête lorsque je tente de lancer ggplot
ou même quand je veux faire une analyse serviles! Une solution serait de supprimer la classe labelled
de chaque variable data.frame
. Comment puis je faire ça? Est-ce possible? Sinon, quelles sont mes autres options?
Je veux vraiment contourner les variables rééditant « à partir de zéro » avec as.data.frame(lapply(x, as.numeric))
et as.character
le cas échéant ... Et je ne veux certainement pas exécuter SPSS et enlever les étiquettes manuellement (ne pas comme SPSS, ni prendre soin de l'installer)
Merci!
La solution
Vous pouvez éviter de créer des "étiquetés" variables spss.get avec l'argument:., Use.value.labels = false
w <- spss.get('/tmp/my.sav', use.value.labels=FALSE, datevars=c('birthdate','deathdate'))
Le code de Bhattacharya pourrait échouer si la classe du vecteur marquées ont été simplement « étiquetés » plutôt que c ( « marqué », « facteur ») auquel cas il aurait dû être:
class(x[[i]]) <- NULL # no error from assignment of empty vector
L'erreur que vous rapport peut être reproduit avec ce code:
> b <- 4:6
> label(b) <- 'B Label'
> str(b)
Class 'labelled' atomic [1:3] 4 5 6
..- attr(*, "label")= chr "B Label"
> class(b) <- class(b)[-1]
Error in class(b) <- class(b)[-1] :
invalid replacement object to be a class string
Autres conseils
Voilà comment je me débarrasser des étiquettes tout à fait. Similaire à la solution de Jyotirmoy mais fonctionne pour un vecteur ainsi qu'un data.frame. (Crédits partiels à Frank Harrell)
clear.labels <- function(x) {
if(is.list(x)) {
for(i in 1 : length(x)) class(x[[i]]) <- setdiff(class(x[[i]]), 'labelled')
for(i in 1 : length(x)) attr(x[[i]],"label") <- NULL
}
else {
class(x) <- setdiff(class(x), "labelled")
attr(x, "label") <- NULL
}
return(x)
}
Utiliser comme suit:
my.unlabelled.df <- clear.labels(my.labelled.df)
Vous pouvez essayer la fonction read.spss
du paquet foreign
.
Une façon rude et prêt à se débarrasser de la classe labelled
créée par spss.get
for (i in 1:ncol(x)) {
z<-class(x[[i]])
if (z[[1]]=='labelled'){
class(x[[i]])<-z[-1]
attr(x[[i]],'label')<-NULL
}
}
Mais pouvez-vous s'il vous plaît donner un exemple où labelled
provoque des problèmes?
Si j'ai un MAED
variable dans un x
de trame de données créée par spss.get
, je:
> class(x$MAED)
[1] "labelled" "factor"
> is.factor(x$MAED)
[1] TRUE
Code si bien écrit qui attend un facteur (par exemple) ne devrait pas avoir de problèmes.
Eh bien, je me suis dit que la fonction unclass
peut être utilisée pour supprimer des classes (qui diront, oui!):
library(Hmisc)
# let's presuppose that variable x is gathered through spss.get() function
# and that x is factor
> class(x)
[1] "labelled" "factor"
> foo <- unclass(x)
> class(foo)
[1] "integer"
Il est pas la solution la plus chanceuse, imaginez en arrière-conversion tas de vecteurs ... Si quelqu'un arrive en tête, je vais vérifier comme une réponse ...
Supposons que:
library(Hmisc)
w <- spss.get('...')
Vous pouvez supprimer les étiquettes d'une variable appelée « var1 » en utilisant:
attributes(w$var1)$label <- NULL
Si vous voulez également supprimer la classe « labbled », vous pouvez le faire:
class(w$var1) <- NULL
ou si la variable a plus d'une classe:
class(w$var1) <- class(w$var1)[-which(class(w$var1)=="labelled")]
Hope this helps!