#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, так как оно никогда не будет истинным.