2016-09-24 7 views
4

Пакет Hadley Wickham's haven, примененный к файлу Stata, возвращает кусочек со многими столбцами типа «помечено». Вы можете увидеть их с ул(), например:R: Извлечение атрибута меток из «помеченных» столбцов столбцов из импорта гаваней из Stata

$ MSACMSZ :Class 'labelled' atomic [1:8491861] NA NA NA NA NA NA NA NA NA NA ... 
    .. ..- attr(*, "label")= chr "metropolitan area size (cmsa/msa)" 
    .. ..- attr(*, "labels")= Named int [1:7] 0 1 2 3 4 5 6 
    .. .. ..- attr(*, "names")= chr [1:7] "not identified or nonmetropolitan" "100,000 - 249,999" "250,000 - 499,999" "500,000 - 999,999" ... 

Было бы хорошо, если бы я мог просто извлечь все эти меченые векторы к факторам, но я сравнил длину этикетки атрибут к числу уникальных значений в каждом векторе, а иногда и длиннее, а иногда и короче. Поэтому я думаю, что мне нужно посмотреть на всех из них и решить, как обращаться с ними по отдельности.

Поэтому я хотел бы извлечь значения атрибута меток в список. Однако эта функция:

labels93 <- lapply(cps_00093.df, function(x){attr(X, which="labels", exact=TRUE)}) 

возвращает NULL для всех переменных.

Является ли это проблемой для фотоэлементов и данных? Как извлечь эти атрибуты из столбцов столбцов в список?

Обратите внимание, что вектор меток назван, и мне нужны как метки, так и имена.

По запросу @ Hack-R здесь крошечный фрагмент моих данных, преобразованный dput (который я никогда раньше не использовал). Я применил этот код:

filter(cps_00093.df, YEAR==2015) %>% 
    sample_n(10) %>% 
    select(HHTENURE, HHINTYPE) -> tiny 
dput(tiny, file = "tiny") 

для создания файла крошечный. Привет! Это было легко! Я думал, что это будет трудно отломиться от этой маленькой части.

Открытие крошечное с Notepad ++, это то, что я нашел:

structure(list(HHTENURE = structure(c(2L, 1L, 1L, 2L, 1L, 1L, 
1L, 2L, 1L, 1L), labels = structure(c(0L, 1L, 2L, 3L, 6L, 7L), .Names = c("niu", 
"owned or being bought", "rented for cash", "occupied without payment of cash rent", 
"refused", "don't know")), class = "labelled"), HHINTYPE = structure(c(1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), labels = structure(1:3, .Names = c("interview", 
"type a non-interview", "type b/c non-interview")), class = "labelled")), row.names = c(NA, 
-10L), class = c("tbl_df", "tbl", "data.frame"), .Names = c("HHTENURE", 
"HHINTYPE")) 

Я подозреваю, что это можно было бы сделать более удобным для чтения с небольшим интервалом, но я не хочу портить с ним, опасаясь случайного уничтожения соответствующих Информация.

+0

Мог бы вы 'dput()' минимального количество данных, необходимое для воспроизводимого примера, который инкапсулирует эту проблему? –

+0

См. '? Haven :: labelled'; они имеют свой собственный метод 'as_factor'. – alistaire

+0

Спасибо за подсказку, @alistaire! К сожалению, относительная длина числа уникальных значений в части данных каждого столбца и вектора меток находится по всей карте. Для большинства столбцов нет ни одного совпадения, ни пары ошибок. Поэтому я не готов доверять конверсии одного размера, пока я не посмотрю более внимательно на данные и не выясню, что происходит. – andrewH

ответ

2

Я собираюсь ответить на этот вопрос, хотя мой код не очень красив.

Сначала я создаю функцию для извлечения именованного атрибута из одного столбца.

ColAttr <- function(x, attrC, ifIsNull) { 
# Returns column attribute named in attrC, if present, else isNullC. 
    atr <- attr(x, attrC, exact = TRUE) 
    atr <- if (is.null(atr)) {ifIsNull} else {atr} 
    atr 
} 

Тогда функция lapply ее ко всем столбцам:

AtribLst <- function(df, attrC, isNullC){ 
# Returns list of values of the col attribute attrC, if present, else isNullC 
    lapply(df, ColAttr, attrC=attrC, ifIsNull=isNullC) 
} 

Наконец я запустить его для каждого атрибута.

stub93 <- AtribLst(cps_00093.df, attrC="label", isNullC=NA) 

labels93 <- AtribLst(cps_00093.df, attrC="labels", isNullC=NA) 
labels93 <- labels93[!is.na(labels93)] 

Все столбцы имеют атрибут «ярлык», но только некоторые из них типа «помечены» и поэтому имеют атрибут «метки». Атрибут меток называется, где метки соответствуют значениям данных, а имена сообщают вам, что означают эти значения.

1

В исходном вопросе спрашивается, как «извлечь значения атрибута меток в список». Решение основного вопроса следующим образом (при условии, some_df импортируется через haven и имеет label атрибутов):

library(purrr) 
n <- ncol(some_df) 
labels_list <- map(1:n, function(x) attr(some_df[[x]], "label")) 

# if a vector of character strings is preferable 
labels_vector <- map_chr(1:n, function(x) attr(some_df[[x]], "label"))