2012-07-23 54 views
1

我在數據框中有9880條記錄,我試圖將它分成9組,每組1000條,最後一組將有880條記錄並相應地命名它們。我用for循環1-9組,但手動最後880條記錄,但我相信有更好的方法來實現這一目標,將數據幀拆分爲子集數據框並將它們即時命名(for循環)

library(sqldf) 
for (i in 0:8) 
{ 
assign(paste("test",i,sep="_"),as.data.frame(final_9880[((1000*i)+1):(1000*(i+1)), (1:53)])) 
} 
test_9<- num_final_9880[9001:9880,1:53] 

也一時無法全部零件追加在一個for循環!

#append all parts 
all_9880<-rbind(test_0,test_1,test_2,test_3,test_4,test_5,test_6,test_7,test_8,test_9) 

任何幫助表示讚賞,謝謝!

+0

讓我明白這一點。你正試圖將每1000個觀察值移動到一個單獨的對象(test_1,test_2 ...),然後在最後把它們混合在一起?難道你不會和你開始時一樣嗎? – 2012-07-23 07:35:43

回答

2

一個小的變化上this解決方案

ls <- split(final_9880, rep(0:9, each = 1000, length.out = 9880)) # edited to Roman's suggestion 
for(i in 1:10) assign(paste("test",i,sep="_"), ls[[i]]) 

你的命令的結合應該工作。

編輯

如果你有,你可以使用一個解析-EVAL組合許多dataframes。爲了便於閱讀,我使用包gsubfn

library(gsubfn) 
nms <- paste("test", 1:10, sep="_", collapse=",") 
eval(fn$parse(text='do.call(rbind, list($nms))')) 

這是如何工作的?首先,我創建一個包含dataframes

> paste("test", 1:10, sep="_", collapse=",") 
[1] "test_1,test_2,test_3,test_4,test_5,test_6,test_7,test_8,test_9,test_10" 

的逗號分隔的列表的字符串然後我用這個字符串中使用parseeval用繩子插值來構建列表

list(test_1,test_2,test_3,test_4,test_5,test_6,test_7,test_8,test_9,test_10) 

eval(fn$parse(text='list($nms)')) 

字符串插值經由的parsefn$前綴實現,它的效果是截取和與包含在可變nms字符串替代$nms。解析和評估字符串"list($mns)"將創建所需的列表。在解決方案中,rbind包含在parse-eval組合中。

EDIT 2

你可以收集具有一定模式的所有變量,把它們放在一個列表,並通過行約束力。

do.call("rbind", sapply(ls(pattern = "test_"), get, simplify = FALSE)) 

ls發現所有變量在列表

do.call模式「TEST_」

sapply檢索所有這些變量,並將它們存儲拉平列表行明智。

+0

謝謝!我知道rbind的工作原理..但假設文件是​​百萬條記錄,我分裂成100個部分...它將是單個rbind厭倦,是否有任何方法來追加他們使用for循環或什麼? – 2012-07-23 05:44:33

+0

爲什麼你需要綁定他們?它當然會返回原始數據? – mnel 2012-07-23 05:49:59

+1

十二宮,看我的編輯。 – Ryogi 2012-07-23 05:52:08

2

沒有找到需要的環路 - 使用split

data <- data.frame(a = 1:9880, b = sample(letters, 9880, replace = TRUE)) 

splitter <- (data$a-1) %/% 1000 

.list <- split(data, splitter) 

lapply(0:9, function(i){ 
    assign(paste('test',i,sep='_'), .list[[(i+1)]], envir = .GlobalEnv) 
    return(invisible()) 
}) 

all_9880<-rbind(test_0,test_1,test_2,test_3,test_4,test_5,test_6,test_7,test_8,test_9) 

identical(all_9880,data) 
## [1] TRUE 
+0

非常感謝...這個作品完美:) – 2012-07-23 05:43:09

相關問題