Rimuovere etichette delle variabili collegate con le funzioni di importazione stranieri / Hmisc SPSS

StackOverflow https://stackoverflow.com/questions/2394902

  •  25-09-2019
  •  | 
  •  

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!

È stato utile?

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!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top