在 STATA 中,在回圈中動態創建變數很容易,因為引號 `' 標識迭代器。此示例將創建一個二進制變數 Y200X,如果 Year 小于 200X,則該變數取值為 1:
set obs 10
gen Year = 2005
replace Year = 2010 if _n > 4
forvalues y = 2005(1)2020 {
gen byte Y`y' = 0
replace Y`y' = 1 if Year < `y'
}
在 R 中,迭代器不能直接用于創建變數名。我發現最好的方法是首先在回圈中創建變數,然后將它們組裝回回圈外的資料幀中:
Year <- c(2005,2010,1996,1994,2001,2006,2019,2021, 2018,1987)
ls.output <- as.data.frame(Year)
for(y in 2005:2020) {
assign(paste0("Y",y), ifelse(ls.output$Year < y, 1, 0))
}
ls.output<- cbind(ls.output, Y2005,Y2006,Y2007,Y2009, Y2010)
有沒有更好的方法可以直接在回圈中執行此操作?
uj5u.com熱心網友回復:
列名可以放在paste一起。跳過創建單獨變數然后將它們作為列添加到資料框中的步驟,而是直接添加它們:
for(y in 2005:2020) {
ls.output[, paste0("Y", y)] <- ifelse(ls.output$Year < y, 1, 0)
}
ls.output
# Year Y2005 Y2006 Y2007 Y2008 Y2009 Y2010 Y2011 Y2012 Y2013 Y2014 Y2015 Y2016 Y2017 Y2018 Y2019 Y2020
# 1 2005 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
# 2 2010 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1
# 3 1996 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
# 4 1994 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
# 5 2001 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
# 6 2006 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1
# 7 2019 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
# 8 2021 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
# 9 2018 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1
# 10 1987 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
uj5u.com熱心網友回復:
使用問題中定義的outerwhere Year。
data.frame(Year, outer(Year, setNames(2005:2010, paste0("Y", 2005:2010)), `<`))
給予:
Year Y2005 Y2006 Y2007 Y2008 Y2009 Y2010
1 2005 0 1 1 1 1 1
2 2010 0 0 0 0 0 0
3 1996 1 1 1 1 1 1
4 1994 1 1 1 1 1 1
5 2001 1 1 1 1 1 1
6 2006 0 0 1 1 1 1
7 2019 0 0 0 0 0 0
8 2021 0 0 0 0 0 0
9 2018 0 0 0 0 0 0
10 1987 1 1 1 1 1 1
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/347906.html
上一篇:EclipseSTS-記憶體不足
