Enlever les étiquettes variables attachées aux fonctions d'importation étrangères / Hmisc SPSS

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

  •  25-09-2019
  •  | 
  •  

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!

Était-ce utile?

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!

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top