2010-03-07 7 views
8

Come al solito, ho avuto qualche file di SPSS che ho importato in R con spss.get funzione dal Hmisc pacchetto. Sono infastidito dalla classe labelled che Hmisc::spss.get aggiunge a tutte le variabili in data.frame, quindi voglio rimuoverlo.Rimuovere etichette delle variabili collegate con le funzioni di stranieri/Hmisc SPSS importazione

labelled classe mi dà mal di testa quando provo a eseguire ggplot o anche quando voglio fare qualche analisi umile! Una soluzione potrebbe essere quella di rimuovere la classe labelled da ciascuna variabile in data.frame. Come lo posso fare? È possibile? In caso contrario, quali sono le mie altre opzioni?

Ho molta voglia di bypassare reediting variabili "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 come SPSS, né la cura per installarlo)!

Grazie!

risposta

4

È 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 sicuro se la classe del vettore marcate sono state semplicemente "etichettati" anziché c ("etichetta", "fattore") nel qual caso sarebbe 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 
2

È 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 può prego di dare un esempio in cui labelled causa problemi?

Se ho una variabile MAED 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 (ad esempio) non dovrebbe avere alcun problema.

+0

In realtà, questo approccio non rimuove la classe 'labelled'. Ecco un errore: 'Errore nella classe (x [[i]]) <- z [-1]: oggetto di sostituzione non valido come stringa di classe – aL3xa

+0

Ha funzionato con un file SPSS che ho provato. Potete per favore collegare a un file di esempio dove questo fallisce? Oppure fornire l'output di per (i in 1: ncol (x)) print (classe (x [[i]])) dove x è il frame di dati importato. –

+0

Non ti piacerebbe provare 'sapply (x, class)' invece di usare loop? Oh, e, purtroppo, non riesco a ricordare quale file di dati stavo usando ... È stato tanto tempo fa ... – aL3xa

0

Beh, ho capito che unclass funzione può essere utilizzata per rimuovere le classi (che sarebbe dire, sì ?!):

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 lo supera, lo controllerò come risposta ...

0

Supponiamo:

library(Hmisc) 
w <- spss.get('...') 

Si potrebbe rimuovere le etichette di una variabile chiamata "var1" utilizzando:

attributes(w$var1)$label <- NULL 

Se anche voi volete 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!

8

Ecco come mi sono sbarazzato del tutto le etichette. Simile alla soluzione di Jyotirmoy ma funziona per un vettore e anche per 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) 
} 

Utilizzare come segue:

my.unlabelled.df <- clear.labels(my.labelled.df) 
Problemi correlati