2017-02-23 44 views
1

我試圖得到一個for循環,產生從的大數據幀多個較小dataframes:誤差內貼for循環

Year <- rep(1995:2012,4) 
Name <- rep(LETTERS[1:4],18) 
abc <- data.frame(Year,Name) 


for (year in 1995:2012) { 
    assign(paste("dff",year,sep=""), abc[abc$Year == year,]) 
    #paste("dff",year,sep="") <- paste("dff",year,sep="")[with(paste("dff",year,sep=""), order(Name)), ] 
} 

問題是最後的(註釋)線,註釋掉時拋出一個錯誤:

invalid 'envir' argument of type 'character'

我能做些什麼來解決這個問題?我基本上試圖通過列Name來排序數據幀。

+0

無法對'paste'產生的字符串進行'<-'賦值。 (你沒有在上面的行中做過---你爲此使用了'assign'!)一些想法:(a)在循環之前用'Name'對數據框進行排序。 (b)使用數據框列表來代替:'abc_list = split(abc,abc $ Year)'然後進行排序:'abc_list = lapply(abc_list,function(x)x [order(x $ Name),])) '。例如,請參閱[如何製作數據幀列表](http://stackoverflow.com/questions/17499013/how-do-i-make-a-list-of-data-frames)。 – Gregor

回答

2

無論您使用list()或調整代碼如下方式:只需提供一些額外的選項的利益

Year <- rep(1995:2012,4) 
Name <- rep(LETTERS[1:4],18) 
abc <- data.frame(Year,Name) 


for (year in 1995:2012) { 
    assign(paste("dff",year,sep=""), abc[abc$Year == year,]) 
    assign((paste("dff",year,sep="")), get(paste("dff",year,sep=""))[with(get(paste("dff",year,sep="")), order(Name)), ]) 
} 
2

,或者使用assign如果您有興趣使用列表,以及或避免我們可以做到以下幾點:

library(data.table) 

Year <- rep(1995:2012,4) 
Name <- rep(LETTERS[1:4],18) 
abc <- data.frame(Year,Name) 

abc <- data.table(abc) 
my_list <- split(abc, Year) 
my_list <- lapply(my_list, function(x){x[order(Name)]}) 

很簡單,避免使用getassignsplit擺脫了循環切割數據表的需要。可能更容易閱讀/理解。

如果你想堅持的東西用一個for循環,即你有什麼最初,你可以這樣做:

empty_list <- list() 

for(i in unique(abc[,Year])){ 
    empty_list[[paste0(i)]] <- abc[Year == i,] 
    empty_list[[paste0(i)]] <- empty_list[[paste0(i)]][order(Name)] 
} 

有人也許可以寫一個更清潔的環比以上,但它的工程!