Эффективный способ условно редактировать метки значений

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

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

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
Другие вопросы по тегам