2017-08-27 57 views
0

我怎樣才能更有效地編寫下面的代碼(即少用幾行)?如何更有效地編寫下面的代碼?

我似乎無法定義一個函數與去年參數,並喜歡寫東西Data{Year} = read.csv('{Year}.csv')Data{Year}${Year+1} = 0等等

## Load data ## 

Data2011 = read.csv('2011.csv') 
Data2012 = read.csv('2012.csv') 
Data2013 = read.csv('2013.csv') 
Data2014 = read.csv('2014.csv') 

## Year dummies ## 

Data2011$D2011 = 1 
Data2011$D2012 = 0 
Data2011$D2013 = 0 
Data2011$D2014 = 0 

Data2012$D2011 = 0 
Data2012$D2012 = 1 
Data2012$D2013 = 0 
Data2012$D2014 = 0 

Data2013$D2011 = 0 
Data2013$D2012 = 0 
Data2013$D2013 = 1 
Data2013$D2014 = 0 

Data2014$D2011 = 0 
Data2014$D2012 = 0 
Data2014$D2013 = 0 
Data2014$D2014 = 1 

回答

5

好了,我會在第一循環中讀取數據,並附加一年的新專欄。

dat <- lapply(2011:2014, function(y) cbind(Year=y, read.csv(paste0(y, '.csv'))) 

現在,傻瓜最常見的用途是當你擬合模型,所以我猜你想要把所有的數據一起。

dat <- do.call(rbind, dat) 

然後在大多數模型擬閤中,你永遠不會自己製作傻子,這是計算機的工作。你只需要將感興趣的變量作爲一個因素,然後R就會做正確的事情。

dat$Year <- factor(dat$Year) 

這就是我平時所做的一切。但是如果由於某種原因,我真的想自己製作這些傻瓜,我仍然會讓計算機這樣做,然後將其添加到數據集中。

dums <- model.matrix(~0+Year, data=dat) 
dat <- cbind(dat, dums) 

學習如何循環和訪問的變量,你也可以做這樣的事情,那裏的[[允許您使用字符串來訪問或創建一個變量名的宗旨,與*1轉換一個布爾值爲0/1。

for(y in unique(dat$year)) { 
    dat[[paste0("Year", y)]] <- (dat$Year==y)*1 
} 
相關問題