2017-04-26 43 views
-1

嘗試對數據幀執行情感分析,但遇到一些內存問題,因此希望將其分解爲塊。我有一個大約100K行的數據框,並且想要一次分成10K行。任何想法都可以通過編程方式輕鬆完成。這是我到目前爲止有:在100000的數據框中一次循環10000行

#grabbing product review data 
product_reviews <- dbGetQuery(conn,"select * from product_reviews";) 

for (i in 1:nrow(product_reviews)) { 

    # running sentiment algorithm on data, ADDING DATASET TO UPLOAD 
    emo <- sentiment(product_reviews$REVIEW_TITLE) 
    sql <- "select element_id, 
       avg(sentiment) as avg_sentiment,max(sentiment) as max_sentiment, 
       min(sentiment) as min_sentiment 
      from emo group by 1" 
    emo_avg <- sqldf(sql) 
    class_emo <- classify_emotion(product_reviews$REVIEW_TITLE, algorithm="bayes", prior=1.0) 

    new <- cbind(product_reviews, 
       emo_avg$avg_sentiment, 
       emo_avg$max_sentiment, 
       emo_avg$min_sentiment, 
       emo_avg$emotion) 
} 

基本上,for語句,而不是通過所有行product_reviews循環,我怎麼能遍歷排第1至10000,然後10001 20000等等。

謝謝!

+0

請參閱[mcve]如何提出問題。 –

+0

一次處理內置BOD數據幀2行。這裏的處理只是打印行的子集。 (for print(fn $ sqldf(「select * from BOD limit 2 offset $ i」))(for i(selo(0,nrow(BOD) –

回答

1

如果您遇到內存問題,我不知道重構您的循環是否有助於任何事情 - 無論您如何閱讀,處理和存儲相同數量的信息,都可能需要進行讀取,處理和存儲。切片。

話雖這麼說,它分塊立即浮現在腦海中的兩種方式是手工:

for(i in 1:10000) { 
    stuff 
} 
other stuff to deal with memory issues? 

for(i in 10001:20000) { 
    stuff again 
} 
other stuff to deal with memory issues? 

... 
ad nauseum ad infinitum 

或稍多編程:

for(j in 1:ceiling(nrow(product_reviews)/10000)) { 
    for(i in (10000*(j-1)+1):(min(10000*j, nrow(product_reviews)))) { 
     stuff 
    } 
    probably some other stuff to deal with memory issues? 
} 

所以......這可能會贏得這場戰鬥但也許不是戰爭。祝你好運!