Итак, я работаю в области социальных наук, и мне часто приходится манипулировать несколькими переменными для изменения значений. Чаще всего это означает изменение масштаба. Я давно работаю с SPSS , и синтаксис там довольно прост. Чтобы изменить значения нескольких переменных, вы пишете:
RECODE var1 var2 var3 (1=5) (2=4) 4=2) (5=1) (ELSE=COPY).
Чтобы записать новые коды в новые переменные, вы добавляете into newvar1 newvar1 newvar3.
в конце. В скобках вы можете использовать такие вещи, как hi
, lo
, 1 to 4
и т. Д.
Теперь я вхожу в R и борюсь занайти лучший способ сделать аналогичные рабочие процессы. Я нашел следующие решения, но не могу найти хороший короткий путь:
## Packages -----
library(dplyr)
library(car)
## Data -----
tib <- tibble(v1 = 1:4,
v2 = 1:4,
v3 = sample(1:5, 4, replace = FALSE))
vars <- c("v1", "v2", "v3")
Базовый путь:
tib$v2_rec <- NA
tib$v2_rec[tib$v2 == 1] <- 5 #1
tib$v2_rec[tib$v2 == 2] <- 4 #2
tib$v2_rec[tib$v2 == 3] <- 3 #3
tib$v2_rec[tib$v2 == 4] <- 2 #4
tib$v2_rec[tib$v2 == 5] <- 1 #5
# I'm forced to create a new variable here, otherwise #4 and #5 overwrite #1 and #2.
# Therefore I won't even bother to try to loop trough multiple variables.
recode () из пакета автомобилей:
tib$v1 <- recode(tib$v1, "1=5; 2=4; 4=2; 5=1")
# This is nice, understandable and short
# To handle multiple variables the following solutions won't work, because the reload functions seems not to be able to iterate through lists:
tib[vars] <- recode(tib[vars], "1=5; 2=4; 4=2; 5=1")
tib[1:3] <- recode(tib[1:3], "1=5; 2=4; 4=2; 5=1")
# I'd be forced to loop:
for (i in vars) {
tib[[i]] <- recode(tib[[i]], "1=5; 2=4; 4=2; 5=1")
}
Я очень доволен этим, но мне было интересно, есть ли функция, которая будет выполнять зацикливание для меня. Сейчас я действительно борюсь с функциями dplyer, и я не рад, что не могу понять все интуитивно ...
Я пытался изменить:
#I get it for a single case and for multiple cases i got to a solution in combination with the recode() function:
tib <- tib %>%
mutate_at(vars(v1:v3),
function(x) recode(x, "1=5; 2=4; 4=2; 5=1"))
это лучший способ сделать это? Просто чтобы быть понятным, я видел некоторые другие решения, использующие case_when (), replace () или mapvalues (), но я нашел решение выше, потому что мне нравится видеть, какое значение перекодируется в какое значение одним проблеском.
Я немного попал в функцию apply () и не смог даже перекодировать одну переменную с ней. Я уверен, что в скором времени я получу контроль над этим, но сейчас я просто немного расстроен тем, как долго я искал рабочие процессы, которые заняли у меня одну строчку в SPSS. Если бы вы знали какое-либо более короткое и чистое решение, чем приведенное выше, с использованием функции apply (), я был бы очень рад!
Я доволен R и его возможностями, но сейчас мне нужен намек в правильном направлении, чтобыподдержи меня! Заранее спасибо!