[[
- это то, что вы ищете. Вот прямой перевод без дополнительных пакетов.
## 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
), и вы его возненавидите. Намного проще содержать все во фрейме данных.