2012-10-30 91 views
4

我有一個R數據框稱爲mydata與具有一定年齡和一定的身高的人數。因此之內的數據框我有變量mydata$ageto10(= 10歲以下的人數),mydata$ageto20(= 20歲以下的人數)等等,年齡35,42和65.身高(和其他一些變數)也是如此。如何在for循環中的數據框中創建變量?

我想創建新的變量,它指的是年齡在10到25歲之間,年齡在25到35歲,35到42歲和42到65歲之間的人數。因此,對於第一種情況,我想做的事:

mydata$age10to25 <- mydata$ageto25 - mydata$ageto10 

這工作,但我想這樣做在所有範圍,以及高度和其他變量這樣做。必須有比複製粘貼40次更簡單的方法並手動更改變量名稱! :)

我認爲應該是這樣的:

for (i in c("age", "height")) 
{ 
    for (k in c(10,20,35,42, 65)) 
    { 
    assign(paste("mydata$", i, k, "to", <<next k here>>, sep=""), get(paste("mydata$", i, <<next k here>>, , sep="")) - get(paste("mydata$", i, k, , sep="")) 
    } 
} 

但顯然,這並不工作(即使我填寫由手動K,似乎assign命令並不意味着分配變量名到當前數據。

什麼是做到這一點的最好方法是什麼?

回答

6

我相信你是從另一個統計軟件包難民(stata或許或SAS),你不能使用分配給指定的列使用$paste。一般而言,如果您使用assign進行標準任務,您正在做的事情不是慣用的,或者有更好的解決方案。需要

lower <- c(10,25,35,42) 
upper <- c(25,35,42,65) 

# create the differences 
newData <- myData[,paste0('ageto',upper)] - myData[, paste0('ageto',lower)] 
# name them with valid names (not starting with numbers 
names(newData) <- paste0('from',lower,'to',upper) 
# add as columns to the original 
myData <- cbind(myData, newData) 

沒有循環!

+0

沒辦法,太棒了!謝謝! (PS:是的,來自Stata的難民;-)我每天都越來越愛着R) – user1780218

+0

+1 for paste0,請不要忘記那個! –

+0

ps:恭喜10k –

相關問題