Rimuovere etichette delle variabili collegate con le funzioni di importazione stranieri / Hmisc SPSS
Domanda
Come al solito, ho avuto qualche file SPSS che ho importato in R con la funzione spss.get
dalla confezione Hmisc
. Sto disturbato con classe labelled
che Hmisc::spss.get
aggiunge a tutte le variabili in data.frame
, quindi voglio rimuoverlo.
class labelled
mi dà il mal di testa quando cerco di ggplot
corsa o anche quando voglio fare alcune analisi umili! Una soluzione potrebbe essere quella di rimuovere classe labelled
da ogni variabile in data.frame
. Come posso fare ciò? È che possibile a tutti? In caso contrario, quali sono le mie altre opzioni?
Ho molta voglia di variabili bypass reediting "da zero" con as.data.frame(lapply(x, as.numeric))
e as.character
se del caso ... E di certo non voglio correre SPSS e rimuovere le etichette manualmente (non mi piace SPSS, né la cura per installarlo) !
Grazie!
Soluzione
È possibile evitare di creare variabili "etichettate" in spss.get con l'argomento:., Use.value.labels = FALSE
w <- spss.get('/tmp/my.sav', use.value.labels=FALSE, datevars=c('birthdate','deathdate'))
Il codice da Bhattacharya potrebbe non riuscire se la classe del vettore con l'etichetta sono stati semplicemente "etichettati" piuttosto che c ( "etichetta", "fattore"), nel qual caso avrebbe dovuto essere:
class(x[[i]]) <- NULL # no error from assignment of empty vector
L'errore che rapporto può essere riprodotto con questo codice:
> 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
Altri suggerimenti
Ecco come mi libero delle etichette del tutto. Simile a soluzione, ma opere di Jyotirmoy per un vettore e un data.frame. (Crediti parziali a 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)
}
Usa come segue:
my.unlabelled.df <- clear.labels(my.labelled.df)
È possibile provare la funzione read.spss
dal pacchetto foreign
.
Un modo rozzo e pronto a sbarazzarsi della classe labelled
creato da 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
}
}
Ma si può piacere a dare un esempio in cui labelled
causa problemi?
Se ho un MAED
variabile in un frame di dati x
creato da spss.get
, ho:
> class(x$MAED)
[1] "labelled" "factor"
> is.factor(x$MAED)
[1] TRUE
codice in modo ben scritto che si aspetta un fattore di (diciamo) non dovrebbe avere alcun problema.
Bene, ho capito che la funzione unclass
può essere utilizzato per rimuovere le classi (che sarebbe dire, eh?!):
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"
Non è la soluzione più fortunato, solo immaginare back-conversione gruppo di vettori ... Se qualcuno supera questo, io controllerò come una risposta ...
Supponiamo che:
library(Hmisc)
w <- spss.get('...')
Si potrebbe rimuovere le etichette di una variabile chiamata "var1" utilizzando:
attributes(w$var1)$label <- NULL
Se si desidera anche rimuovere la classe "labbled", si potrebbe fare:
class(w$var1) <- NULL
o se la variabile ha più di una classe:
class(w$var1) <- class(w$var1)[-which(class(w$var1)=="labelled")]
Spero che questo aiuti!