(如何)在处理面板数据时,我可以像在 Stata(foreach 循环)中一样轻松地在 R 中创建多个变量?

(How) can I create mulitple variables in R similar as easily as in Stata (foreach loop) when working with panel data?

在 Stata 中处理面板数据时,可以像这样一次创建和修改多个变量:

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

第一步,此命令只是将变量 kp1_190abkp2_190ab 等复制并重命名为 vote1vote2 等。下一步很简单replace 命令依赖于其他变量(v_intention1v_intention7)。

是否可以在 R 中创建执行类似操作的循环?在 Stata 中,可以使用通配符“x”非常有用,但我在 R 中找不到类似的东西。

[[ 就是您要找的。 这里是直接翻译,不使用额外的包。

## 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
}

您可以使用 ifelseapply 等使其更短,但思路相同。我会将其编码为:

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) 很难,但您仍然可以使用 getassign 来完成。例如,assign(sprintf("b%d",4), get(sprintf("a%d",4))) 等同于 b4 <- a4。在没有数据框的情况下将其实现为函数将涉及环境 (?environment),您会讨厌它。将所有内容包含在数据框中要简单得多。