(Как) я могу создать несколько переменных в R так же легко, как в Stata (foreach l oop) при работе с данными панели? - PullRequest
0 голосов
/ 28 апреля 2020

При работе с данными панели в Stata можно создавать и изменять сразу несколько переменных следующим образом:

foreach wave of numlist 1/7 {
    clonevar vote`wave' = kp`wave'_190ab
    replace vote`wave' = 8 if v_intention`wave' == 0
}

На первом этапе эта команда просто копирует и переименовывает переменные kp1_190ab, kp2_190ab et c. до vote1, vote2 и др. c. Следующим шагом является простая команда replace, которая зависит от других переменных (от v_intention1 до v_intention7).

Возможно ли создать циклы в R, которые выполняют подобные действия? В Stata очень полезно использовать подстановочный знак `x ', но я не смог найти что-то подобное в R.

1 Ответ

0 голосов
/ 28 апреля 2020

[[ - это то, что вы ищете. Вот прямой перевод без дополнительных пакетов.

## DF is your data frame
for (wave in 1:7) {
    newvar <- paste0('vote',wave)
    DF[[newvar]] <- DF[[paste0('kp',wave,'_190ab')]]
    DF[DF[[paste0('v_intention',wave)]]==0, newvar] <- 8
}

Вы можете сделать его короче, используя ifelse, apply, et c., Но та же идея. Я бы кодировал его так:

f <- function(DF,srcfmt,wave,tstfmt) {
    srcvar <- sprintf(srcfmt, wave)
    tstvar <- sprintf(tstfmt, wave)
    ifelse(DF[[tstvar]] == 0, 8, DF[[srcvar]])
}
for (wave in 1:7) {
    DF[[paste0('vote',wave)]] <- f(DF,'kp%d_190ab',wave, 'v_intention%d')
}

Выше f можно записать на одной длинной строке.

Без фрейма данных (DF) это сложно, но вы все равно можете сделать это с использованием get и assign. Например, assign(sprintf("b%d",4), get(sprintf("a%d",4))) эквивалентно b4 <- a4. Реализация его как функции без фрейма данных потребует окружения (?environment), и вы его возненавидите. Намного проще содержать все во фрейме данных.

...