2016-01-15 12 views
6

W R niektóre pakiety (na przykład haven) wstawiają atrybuty label do zmiennych (na przykład haven), co wyjaśnia merytoryczną nazwę zmiennej. Na przykład gdppc może mieć etykietę GDP per capita.Wygodny sposób uzyskiwania dostępu do etykiety zmiennych po zaimportowaniu danych Staty za pomocą przystawki

Jest to niezwykle przydatne, szczególnie podczas importowania danych ze Stata. Jednak wciąż mam problem z wykorzystaniem tego w moim obiegu pracy.

  1. Jak szybko przeglądać zmienną i etykietę zmiennej? Teraz muszę zrobić attributes(df$var), ale nie jest to wygodne, aby rzucić okiem (a la names(df))

  2. Jak używać tych etykiet w działkach? Ponownie mogę użyć attr(df$var, "label"), aby uzyskać dostęp do etykiety łańcuchowej. Wydaje się jednak kłopotliwe.

Czy istnieje jakiś oficjalny sposób wykorzystania tych etykiet w przepływie pracy? Z pewnością mogę napisać niestandardową funkcję, która owija się wokół attr, ale może się zepsuć w przyszłości, gdy pakiety będą inaczej implementować atrybut label. Tak więc, najlepiej chciałbym oficjalny sposób obsługiwany przez haven (lub innych dużych pakietów).

+1

Można stworzyć coś w rodzaju stołu dopasowania, na przykład'lbs <- setNames (_labels_, names (df))'; następnie dostęp do etykiety można uzyskać za pomocą np. 'lbs [" var "]' – MichaelChirico

+1

Różni autorzy pakietów zaimplementowali to inaczej. Standardem _de_facto_ R byłaby funkcja 'read.dta' w pkg: foreign. 'haven' jest relatywnie nowym pakietem iw tej chwili nie ma udokumentowanych planów etykiet. –

+0

@ 42- 'read_dta' w' haven' ma etykietę. Natomiast 'foreign :: read.dta' tak naprawdę nie. Ponadto pakiety 'foreign' nie działają z Statą 13, nie mówiąc już o 14. – Heisenberg

Odpowiedz

3

Jest to jedna z innowacji podjętych w rio (pełne ujawnienie: napisałem ten pakiet). Zasadniczo zapewnia różne sposoby importowania etykiet zmiennych, w tym sposób działania rzeczy zagranicznych i zagranicznych. Oto banalny przykład:

start dokonując powtarzalne przykład:

> library("rio") 
> export(iris, "iris.dta") 

importu przy użyciu foreign::read.dta() (przez rio::import()):

> str(import("iris.dta", haven = FALSE)) 
'data.frame': 150 obs. of 5 variables: 
$ Sepal.Length: num 5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ... 
$ Sepal.Width : num 3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ... 
$ Petal.Length: num 1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ... 
$ Petal.Width : num 0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ... 
$ Species  : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ... 
- attr(*, "datalabel")= chr "" 
- attr(*, "time.stamp")= chr "15 Jan 2016 20:05" 
- attr(*, "formats")= chr "" "" "" "" ... 
- attr(*, "types")= int 255 255 255 255 253 
- attr(*, "val.labels")= chr "" "" "" "" ... 
- attr(*, "var.labels")= chr "" "" "" "" ... 
- attr(*, "version")= int -7 
- attr(*, "label.table")=List of 1 
    ..$ Species: Named int 1 2 3 
    .. ..- attr(*, "names")= chr "setosa" "versicolor" "virginica" 

odczytywane za pomocą haven::read_dta() używając jego zmienną natywne atrybuty ponieważ atrybutów są przechowywane na poziomie data.frame zamiast na poziomie zmiennej:

> str(import("iris.dta", haven = TRUE, column.labels = TRUE)) 
'data.frame': 150 obs. of 5 variables: 
$ Sepal.Length: num 5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ... 
$ Sepal.Width : num 3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ... 
$ Petal.Length: num 1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ... 
$ Petal.Width : num 0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ... 
$ Species  :Class 'labelled' atomic [1:150] 1 1 1 1 1 1 1 1 1 1 ... 
    .. ..- attr(*, "labels")= Named int [1:3] 1 2 3 
    .. .. ..- attr(*, "names")= chr [1:3] "setosa" "versicolor" "virginica" 

Czytaj w użyciu haven::read_dta() użyciu alternatywę, że my (twórcy rio) znaleziony wygodniejsze:

> str(import("iris.dta", haven = TRUE)) 
'data.frame': 150 obs. of 5 variables: 
$ Sepal.Length: num 5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ... 
$ Sepal.Width : num 3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ... 
$ Petal.Length: num 1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ... 
$ Petal.Width : num 0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ... 
$ Species  : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ... 
- attr(*, "var.labels")=List of 5 
    ..$ Sepal.Length: NULL 
    ..$ Sepal.Width : NULL 
    ..$ Petal.Length: NULL 
    ..$ Petal.Width : NULL 
    ..$ Species  : NULL 
- attr(*, "label.table")=List of 5 
    ..$ Sepal.Length: NULL 
    ..$ Sepal.Width : NULL 
    ..$ Petal.Length: NULL 
    ..$ Petal.Width : NULL 
    ..$ Species  : Named int 1 2 3 
    .. ..- attr(*, "names")= chr "setosa" "versicolor" "virginica" 

Przesuwając atrybuty być na poziomie data.frame, są one znacznie łatwiejsze uzyskać dostęp za pomocą attr(data, "label.var") itd. zamiast przekopywania się przez atrybuty każdej zmiennej.

Uwaga: wartości atrybutów będą NULL, ponieważ właśnie piszę natywny zestaw danych R do lokalnego pliku, aby uczynić to powtarzalnym.

+0

Czy używasz' rio' w swoim własnym przepływie pracy? Jak zaangażowany jest zespół do pozostania na bieżąco ze wszystkimi pakietami IO, którymi się pakujesz? Chciałbym mieć scentralizowany pakiet w ten sposób (stąd próbowałem 'haven'), ale martwię się o przyszłą odtwarzalność. – Heisenberg

+0

@Heisenberg Jesteśmy bardzo zaangażowani w aktualizowanie informacji i jestem bardzo wrażliwy na kompatybilność wstecz/do przodu. – Thomas

2

Korzystanie sapply w prostej funkcji, aby powrócić do listy zmiennych, jak w Variable Okno Stata za:

library(dplyr) 
makeVlist <- function(dta) { 
    labels <- sapply(dta, function(x) attr(x, "label")) 
     tibble(name = names(labels), 
      label = labels) 
} 
Powiązane problemy