Эффективный способ условно редактировать метки значений
Я работаю с данными опроса, содержащими метки значений. Пакет убежища позволяет импортировать данные с атрибутами меток значений. Иногда эти метки значений необходимо редактировать обычным способом.
Пример, который я привожу здесь, очень прост, но я ищу решение, которое можно было бы применить к подобным проблемам в больших фреймах данных.
d <- dput(structure(list(var1 = structure(c(1, 2, NA, NA, 3, NA, 1, 1), labels = structure(c(1,
2, 3, 8, 9), .Names = c("Protection of environment should be given priority",
"Economic growth should be given priority", "[DON'T READ] Both equally",
"[DON'T READ] Don't Know", "[DON'T READ] Refused")), class = "labelled")), .Names = "var1", row.names = c(NA,
-8L), class = c("tbl_df", "tbl", "data.frame")))
d$var1
<Labelled double>
[1] 1 2 NA NA 3 NA 1 1
Labels:
value label
1 Protection of environment should be given priority
2 Economic growth should be given priority
3 [DON'T READ] Both equally
8 [DON'T READ] Don't Know
9 [DON'T READ] Refused
Если метка значения начинается с "[НЕ ЧИТАТЬ]", я хочу удалить "[НЕ ЧИТАТЬ]" в начале метки и добавить "(VOL)" в конце. Таким образом, "[НЕ ЧИТАТЬ] Оба одинаково" теперь будет читать "Оба одинаково (VOL)".
Конечно, легко отредактировать эту отдельную переменную с помощью функции из ассоциированного помеченного пакета. Но я хочу применить это решение ко всем переменным в data.frame.
library(labelled)
val_labels(d$var1) <- c("Protection of environment should be given priority" = 1,
"Economic growth should be given priority" = 2,
"Both equally (VOL)" = 3,
"Don't Know (VOL)" = 8,
"Refused (VOL)" = 9)
Как я могу получить результат функции, описанной выше, таким образом, чтобы ее можно было применить к каждой переменной в data.frame?
Решение должно работать независимо от конкретной стоимости. (В этом случае необходимо изменить значения 3,8, & 9, но это не всегда так).
0 ответов
Есть несколько способов сделать это. Вы могли бы использоватьlapply()
или (если вам нужен one(ish)-liner) вы можете использовать любой из вариантов с ограниченной областью видимости mutate()
:
1). С помощьюlapply()
Этот метод перебирает все столбцы с gsub()
чтобы удалить ненужную часть и добавить " (VOL)"
до конца строки. Конечно, вы можете использовать это и с подмножеством!
d[] <- lapply(d, function(x) {
labels <- attributes(x)$labels
names(labels) <- gsub("\\[DON'T READ\\]\\s*(.*)", "\\1 (VOL)", names(labels))
attributes(x)$labels <- labels
x
})
d$var1
[1] 1 2 NA NA 3 NA 1 1
attr(,"labels")
Protection of environment should be given priority Economic growth should be given priority
1 2
Both equally (VOL) Don't Know (VOL)
3 8
Refused (VOL)
9
attr(,"class")
[1] "labelled"
2) Использование mutate_all()
Используя ту же логику (с тем же результатом), вы можете изменить название меток более аккуратным способом:
d %>%
mutate_all(~{names(attributes(.)$labels) <- gsub("\\[DON'T READ\\]\\s*(.*)", "\\1 (VOL)", names(attributes(.)$labels));.}) %>%
map(attributes) # just to check on the result