(如何)在处理面板数据时,我可以像在 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_190ab
、kp2_190ab
等复制并重命名为 vote1
、vote2
等。下一步很简单replace
命令依赖于其他变量(v_intention1
到 v_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
}
您可以使用 ifelse
、apply
等使其更短,但思路相同。我会将其编码为:
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
),您会讨厌它。将所有内容包含在数据框中要简单得多。
在 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
等复制并重命名为 vote1
、vote2
等。下一步很简单replace
命令依赖于其他变量(v_intention1
到 v_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
}
您可以使用 ifelse
、apply
等使其更短,但思路相同。我会将其编码为:
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
),您会讨厌它。将所有内容包含在数据框中要简单得多。