2017-08-07 111 views
0

請幫助我,因爲我是新來的R和也編程寫一個for循環自動r中創建的數據集的子集

我試圖寫這樣一個循環,應改爲每1000行數據和r中

繼創建數據集是我的試驗

for(i in 0:nl){ 
    df[i] = fread('RM.csv',skip = 1000*i, nrows =1000, 
       col.names = colnames(read.csv('RM.csv', nrow=1, header = T))) 
} 

其中nl是一個整數,並等於數據的長度'RM.csv'

我試圖做的是創建一個函數,該函數將跳過每1000行並讀取下一1000行,並在達到原始數據長度nl後終止。

現在並不強制只使用這種方法。

+0

[在片讀取CSV文件策略?]的可能的複製(https://stackoverflow.com/questions/9352887/strategies-for-reading-in-csv-files-in-pieces) –

回答

2

你可以嘗試讀取整個文件到一個單一的數據幀,然後關閉子集化的行你不想:

df <- read.csv('RM.csv', header=TRUE) 
y <- seq(from = 0, to = 100000, by = 1)  # replace the 'to' value with a value 
seq.keep <- y[floor(y/1000) %% 2 == 0] # large enough for the whole file 
df.keep <- df[seq.keep, ] 

這是一個相當混亂的演示這表明上述順序邏輯是正確的:

Demo

您可以檢查所產生的順序是:

0-999 
2000-2999 
4000-4999 
etc. 

如代碼註釋中所述,確保生成足夠大的序列以適應數據幀的實際大小。

如果您需要繼續使用目前的方法,那麼請嘗試每隔1000行讀取一次,例如,

sq <- seq(from=0, to=nl, by=2) 
names <- colnames(read.csv('RM.csv', nrow=1, header=TRUE)) 
for(i in sq) { 
    df_i <- fread('RM.csv', skip=1000*i, nrows=1000, col.names=names) 
    # process this chunk and move on 
} 
+0

文件的大小是20 GB。因此,如果我試圖一次讀取整個數據,系統就會崩潰。因此,我想讀取大量的數據並在晚些時候執行匹配功能。一旦完成所有事情,它會寫入數據並開始讀取下一個塊,等等。 – user3301082

+0

@ user3301082我更新了我的答案。只要繼續使用當前的方法,但是使用一個以你想讀取的行爲目標的序列來讀取文件。 –

+0

已更新的代碼正在拋出錯誤:找不到對象'df'。但是當我將df [i]更改爲df_i時,循環以無限循環結束。 – user3301082