2010-03-07 5 views
8

Como de costumbre, obtuve algunos archivos SPSS que importé en R con la función spss.get del paquete Hmisc. Me molesta con labelled clase que Hmisc::spss.get se agrega a todas las variables en data.frame, por lo tanto, quiero eliminarlo.Eliminar etiquetas variables adjuntas con funciones de importación de SPSS extranjeras/Hmisc

labelled clase me da dolores de cabeza cuando trato de ejecutar ggplot o incluso cuando quiero hacer algunos análisis seriales! Una solución sería eliminar la clase labelled de cada variable en data.frame. ¿Cómo puedo hacer eso? ¿Es eso posible? Si no, ¿cuáles son mis otras opciones?

Realmente quiero pasar por alto reeditar variables "desde cero" con as.data.frame(lapply(x, as.numeric)) y as.character en su caso ... Y luego, no quiero correr el programa SPSS y quitar las etiquetas de forma manual (no me gusta el programa SPSS, ni cuidar a instalarlo)!

Gracias!

Respuesta

4

Puede evitar la creación de variables "etiquetadas" en spss.get con el argumento:, use.value.labels = FALSE.

w <- spss.get('/tmp/my.sav', use.value.labels=FALSE, datevars=c('birthdate','deathdate')) 

El código de Bhattacharya podría fallar si la clase del vector marcadas se simplemente "etiqueta" en lugar de c ("marcado", "factor"), en cuyo caso debería haber sido:

class(x[[i]]) <- NULL # no error from assignment of empty vector 

El error que informe puede ser reproducida con este código:

> 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

Puede probar la función read.spss del paquete foreign.

Una forma áspera y listo para deshacerse de la clase labelled creado por 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 
    } 
} 

Pero puede por favor dar un ejemplo en el labelled causa problemas?

Si tengo una variable MAED en una trama de datos x creado por spss.get, tengo:

> class(x$MAED) 
[1] "labelled" "factor" 
> is.factor(x$MAED) 
[1] TRUE 

código Así bien escrito que espera un factor (por ejemplo) no debería tener ningún problema.

+0

En realidad, este enfoque no elimina la clase 'labelled'. Aquí hay un error: 'Error en la clase (x [[i]]) <- z [-1]: objeto de reemplazo no válido para ser una cadena de clase ' – aL3xa

+0

Funcionó con un archivo SPSS que probé. ¿Puedes vincular a un archivo de muestra donde esto falla? O ingrese el resultado de para (i en 1: ncol (x)) print (clase (x [[i]])) donde x es el marco de datos importado. –

+0

¿No le gustaría probar 'sapply (x, clase)' en lugar de usar loop? Oh, y, por desgracia, no recuerdo qué archivo de datos estaba usando ... Fue hace tanto tiempo ... – aL3xa

0

Bueno, me di cuenta de que unclass función puede ser utilizada para eliminar las clases (que contarían, 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" 

No es la solución más afortunado, sólo imaginar montón de vectores de back-conversión. .. Si alguien encabeza esto, lo comprobaré como una respuesta ...

0

Supongamos:

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

Podría quitar las etiquetas de una variable llamada "var1" mediante el uso de:

attributes(w$var1)$label <- NULL 

Si también desea eliminar la clase "labbled", que podría hacer:

class(w$var1) <- NULL 

o si la variable tiene más de una clase:

class(w$var1) <- class(w$var1)[-which(class(w$var1)=="labelled")] 

Espero que esto ayude!

8

Así es como me deshago de las etiquetas. Similar a la solución de Jyotirmoy pero funciona tanto para un vector como para un data.frame. (créditos parciales 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) 
} 

Use la siguiente manera:

my.unlabelled.df <- clear.labels(my.labelled.df) 
Cuestiones relacionadas