Используя «применить» и «перекодировать» вместе

#r

Вопрос:

Мне нужно воссоздать некоторые переменные, но вместо использования цикла for я пытаюсь использовать функции «применить» с функцией «перекодировать».

Вот некоторые из кодов, которые я пробовал до сих пор…

вар

recode_vars

Однако это приводит к появлению сообщения об ошибке: Ошибка в match.fun(ЗАБАВА) : аргумент «ЗАБАВА» отсутствует, по умолчанию отсутствует.

Кто-нибудь знает, как я мог бы решить эту проблему? Или просто как использовать «применить» и «перекодировать» вместе в целом?

Комментарии:

1. Не могли бы вы, пожалуйста, использовать следующее и поделиться выведенным кодом: dput(mydata)

2. Я видел много комментариев, и, похоже, мне следует просто указать, с какими данными я работаю… Итак, переменные состоят из числовых значений… var1: 115 123 124 105 116. var2: 86 136 122 115 128. var3: 129 107 101 121 112. var4: 105 111 109 129 125. var5: 127 120 112 137 111. Я пытаюсь перекодировать переменные с помощью «применить» и «перекодировать», чтобы все эти значения были равны 1, если больше 130, и 0 в противном случае. Мне также нужно прикрепить префикс к началу перекодированных имен переменных.

Ответ №1:

Мы можем использовать recode с across

 library(dplyr)
vars <- c("var1", "var2", "var3", "var4", "var5")
mydata %>%
   mutate(across(all_of(vars), ~ recode(., "lo:129" = 0, "130:hi" = 1)))
 

-выход

    var1 var2 var3 var4 var5
1    0    1    1    1    1
2    0    0    1    0    0
3    1    0    1    1    0
4    0    1    0    0    1
 

Или , если нам нужно использовать apply , укажите MARGIN цикл to по столбцам — 2

 mydata[vars] <- apply(mydata[vars], MARGIN = 2, 
     function(x) recode(x, "lo:129" = 0, "130:hi" = 1))
 

данные

 set.seed(24)
mydata <- as.data.frame(matrix(sample(c("lo:129", "130:hi"), 4 * 5, 
   replace = TRUE), ncol = 5, dimnames = list(NULL, paste0("var", 1:5))))
 

Комментарии:

1. Спасибо. Так что это создало для меня новые переменные, но не перекодировало их как 1 и 0. Кроме того, какую функцию я бы указал в «x»?

2. @Брайс, тогда как это перекодируется? Я протестировал код, и он работает нормально, хотя

3. @Bryce Я обновил небольшой воспроизводимый пример. В вашем посте не было никаких данных для тестирования

4. Он сохраняет их первоначальные значения 129, 118, 131 и т. Д. Кроме того, я попытался вставить префикс в имена переменных, чтобы различать их, используя этот код, но он не изменяет их имена… имена столбцов(mydata[vars]) <- paste0(«hi3b_», vars) mydata

5. @Брайс, я не знаю об этом. Как я уже упоминал, я создал пример, который можно воспроизвести.

Ответ №2:

Перекодирование сопоставляет определенные значения с другими конкретными значениями, когда вы, по-видимому, хотите сохранить значения от 129 до 130 и пометить все остальные как низкие(0) или высокие(1). Трудно судить по вашему примеру, потому что неясно, являются ли входные данные целочисленными. Вы можете легко сделать это, используя логику if-then или case_when. Вот быстрое решение, которое поможет вам двигаться дальше.

 library(purrr)
df <- data.frame(var1=runif(10, min = 128, max = 131), 
                 var2=runif(10, min = 128, max = 131))

n  <- df %>% map_dfc(~ case_when(. <= 129 ~ 0, . >= 130 ~ 1, T ~ .))
 

если все входные данные являются целочисленными, вы можете просто удалить последнее предложение в операторе case_when, так как оно никогда не будет истинным.