[英](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
。 將其實現為沒有數據框的 function 將涉及環境( ?environment
),您會討厭它。 將所有內容包含在數據框中要簡單得多。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.