2016-07-28 32 views
0

Ich bin relativ neu zu R und mehr zu Stata verwendet.Verwenden Sie Werte von Stata zu R data.frame aber zeigen Sie Etiketten anstelle von Werten

Ich konnte eine Datenbank von Stata zu einem Rdata.frame mit library(foreign) lesen.

data=read.dta("mydata.dta", 
    convert.dates = TRUE, 
    convert.factors = TRUE, 
    missing.type = FALSE, 
    convert.underscore = FALSE, 
    warn.missing.labels = TRUE) 

Werte (in den sens der Stata Sprache) sind jedoch nicht importiert, nur Etiketten importiert werden.

Lassen Sie mich es ein wenig mehr erklären. Angenommen, ich möchte eine Bildungsvariable namens "edu" manipulieren. In Stata Sprache verwende ich numerische Werte anstelle von Etiketten meine Variable zu manipulieren und der Dateneditor zeigt die Etiketten, solange ich meine Etiketten definiert habe. Nehmen wir zum Beispiel, dass meine Variable „edu“ nimmt die Werte 10 bis 40, ordnet der folgende Code ein Etikett zu jedem Wert:

label define lib_edu 
10 "Less than high-school degree" 
20 "12th grade or higher, no college degree" 
30 "Undergraduate level (2 to 4 years of college)" 
40 "Graduate level (5 years of college or more)", add; 
label values edu lib_edu; 

Dann, wenn ich möchte, dass meine Variable zu manipulieren, ich brauche die Werte zu verwenden. Zum Beispiel, wenn ich will von meinem Dataset Menschen fallen zu lassen, deren Etikett weniger als High-School-Abschluss, habe ich einfach tun:

drop if edu==10 

Aber in meinem importierten Rdata.frame werden die Etiketten als Faktoren importiert. Jedem Faktor ist ein Level zugeordnet, der nicht unbedingt meinen Stata-Werten entspricht, da er von 1 neu gestartet wird. Ich kann Levels nicht benutzen, um meine Variable zu manipulieren. Wenn ich von meinem Dataset Menschen, dessen Label fallen will weniger als High-School-Abschluss, muß ich das ganze Etikett schreiben:

data <- data[data$edu!="Less than high-school degree",] 

, die überhaupt nicht bequem ist, vor allem, wenn das Etikett lang und komplex ist.

Ist es möglich, wie in Stata zu tun, das heißt: manipulieren numerische Werte beim Bearbeiten der Daten.frame mit Etiketten, vorausgesetzt, dass meine Daten aus Stata exportiert werden?

Wir danken Ihnen im Voraus.

+0

Ja, R-Faktoren haben immer Integer-Codes, die von eins aufwärts zählen. Sobald Sie jedoch die neuen Codes kennen, sollten Sie sie wie 'f = factor (c (" a "," b ")) verwenden können; f [labels (f) [f]! = 1] '(außer" a ", das einen Code von 1 hat). Persönlich ordne ich die langen Labels Abkürzungen zu und arbeite mit diesen ("none", "hs", "ug", "g"). – Frank

+1

Ich bekomme aus Ihrer Antwort, dass 1) es nicht möglich ist, Stata Integer-Codes zu verwenden (zumindest nicht beim direkten Import der Daten nach R); aber das 2) es ist möglich, R neue Ebenen zu verwenden; aber das 3) die weniger langweilige Methode bleibt lange Etiketten in kurze umzuwandeln. Danke für Ihre Hilfe. – Elixterra

+1

Ja. Oh, noch eine Sache, ein Vorteil von R: Sie können Faktoren geordert haben und Ungleichungen benutzen, Maxes und Minen nehmen, etc .: 'f = Faktor (c (" hs "," hs "," none "," g ")), levels = c ("keine", "hs", "ug", "g"), geordnet = WAHR); f [f> = "ug"] ' – Frank

Antwort

1

Sie können dieses Problem aus zwei Richtungen angehen: 1. Sie können die Wertelabels aus Stata löschen, bevor Sie Ihre Daten in R importieren, oder 2. Sie können die Datenimporteinstellungen für Ihr data.frame aus R ändern Welche dieser beiden Routen einfacher ist, hängt zu einem gewissen Grad davon ab, welche Version von Stata Sie haben und welches Format Ihre Daten haben.

Option 1:

Wenn Sie dies innerhalb von Stata tun wollen, würde ich in erster Lesung über und möglicherweise die Installation des „label Dienstprogramme“ Paket von SSC empfehlen: sac inst labutil. Dieses Paket enthält neben vielen anderen sehr nützlichen Werkzeugen zum Bearbeiten von Etiketten den Befehl labdtch oder "Label detach", der Ihre Wertelabels von ihren tatsächlichen Werten in den Stata-Daten trennt. Natürlich würden Sie all dies tun, bevor die Daten in R. Import

Option 2:

Wenn Ihre Daten gespeichert wurden mit Stata-Version 13, das R-Paket readstata13 werden Ihnen Zeit und Mühe sparen. Um über das Paket zu lesen: see its manual on CRAN.

Wenn readstata13 mit einer Option ist, werden Sie eine Kombination der Befehle benötigen get.label und/oder get.label.name und sie als Eingänge zu get.origin.codes verwenden, die genau das tun, was Sie suchen. wenn

Schließlich readstata13 mit keine Option ist, sollten Sie versuchen, as.numeric(levels(f))[f] in Ihrem Importbefehl in R. Angabe Aus den Gründen, und weitere Details finden Sie in diesem StackOverflow question.

Ich würde empfehlen, dies durch R zu erreichen, wenn dies möglich ist, da es einen besser reproduzierbaren Workflow ermöglicht. Aber wenn Sie dies über Stata tun, würde ich einen kurzen Kommentar in Ihre R-Datei einfügen, in dem Sie erklären, was Sie in Stata gemacht haben, bevor Sie die Daten importieren.

+0

Ich frage mich immer, was war der Punkt beim Wechsel von Stata12 zu Stata13? Jetzt habe ich die Antwort! – Elixterra