Entfernen variable klebten Etiketten mit fremden / Hmisc SPSS Importfunktionen
Frage
Wie üblich, ich habe einige SPSS-Datei, dass ich in R mit spss.get
Funktion aus Hmisc
Paket importiert haben. Ich bin mit labelled
Klasse gestört, dass Hmisc::spss.get
auf alle Variablen in data.frame
fügt hinzu, will daher, es zu entfernen.
labelled
Klasse gibt mir Kopfschmerzen, wenn ich zu laufen ggplot
versuchen oder sogar, wenn ich will etwas menial Analyse tun! Eine Lösung wäre, labelled
Klasse von jeder Variablen in data.frame
zu entfernen. Wie kann ich das machen? Ist das möglich? Wenn nicht, was sind meine andere Optionen?
Ich möchte Bypass reediting Variablen „von Grund auf“ wirklich mit as.data.frame(lapply(x, as.numeric))
und as.character
wo anwendbar ... Und ich will sicher nicht manuell SPSS und entfernen Etiketten laufen (nicht wie SPSS, noch Pflege, es zu installieren) !
Danke!
Lösung
Sie können vermeiden, "markiert" Variablen in spss.get mit dem Argument zu schaffen.:, Use.value.labels = FALSE
w <- spss.get('/tmp/my.sav', use.value.labels=FALSE, datevars=c('birthdate','deathdate'))
Der Code von Bhattacharya könnte fehlschlagen, wenn die Klasse des markierten Vektor wurde einfach „markiert“, anstatt c ( „markiert“, „Faktor“) in diesem Fall sollte es gewesen sein:
class(x[[i]]) <- NULL # no error from assignment of empty vector
Der Fehler kann berichten, mit diesem Code wiedergegeben werden:
> 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
Andere Tipps
Hier ist, wie ich die Etikett ganz loszuwerden. Ähnlich wie Jyotirmoy Lösung aber Arbeiten für einen Vektor sowie eine data.frame. (Partial Kredite an 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)
}
Verwenden Sie wie folgt vor:
my.unlabelled.df <- clear.labels(my.labelled.df)
Sie können die read.spss
Funktion aus dem foreign
Paket ausprobieren.
Eine grobe und bereit Art und Weise der labelled
Klasse von spss.get
erstellt, um loszuwerden,
for (i in 1:ncol(x)) {
z<-class(x[[i]])
if (z[[1]]=='labelled'){
class(x[[i]])<-z[-1]
attr(x[[i]],'label')<-NULL
}
}
Aber können Sie bitte ein Beispiel geben, wo labelled
Probleme verursacht?
Wenn ich eine Variable MAED
in einem Datenrahmen x
von spss.get
erstellt haben, die ich habe:
> class(x$MAED)
[1] "labelled" "factor"
> is.factor(x$MAED)
[1] TRUE
So gut geschriebenen Code, der einen Faktor (sagen wir) erwartet sollten keine Probleme haben.
Nun, dachte ich, dass unclass
Funktion aus genutzt werden, um Klassen zu entfernen (die sagen würden, ja?!):
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"
Es ist nicht die glücklichste Lösung, stellen Sie sich vor zurück-Converting Bündel von Vektoren ... Wenn jemand diese Tops, ich es als Antwort überprüfen werde ...
Nehmen wir an:
library(Hmisc)
w <- spss.get('...')
Sie können die Etiketten einer Variablen entfernen namens „var1“ durch die Verwendung:
attributes(w$var1)$label <- NULL
Wenn Sie auch die Klasse „labbled“ entfernen möchten, können Sie tun:
class(w$var1) <- NULL
oder wenn die Variable mehr als eine Klasse:
class(w$var1) <- class(w$var1)[-which(class(w$var1)=="labelled")]
Hope, das hilft!