2017-02-16 55 views
0

我有一個很大的數據框架,它由RStudio服務器中的9個mio對象組成,格式如下(每個installnr有很多讀數),當我運行腳本計算每小時所有讀數的平均值和標準誤差線時, R崩潰。避免大量計算時間和超出內存大小的最佳方法是什麼?處理大數據幀時減少計算時間的最佳方法是什麼?

 installnr readdate readings 
    1 002345 2014-08-17 {0,0,0,1,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,0,2,0} 
    2 002345 2014-08-18 {0,0,0,0,0,0,4,1,0,0,0,0,1,1,1,1,0,1,1,1,1,1,0,1} 
    3 002345 2014-08-19 {0,1,2,1,0,1,1,1,2,0,1,0,1,0,1,0,1,0,1,0,2,1,1,0} 
    4 013459 2014-08-17 {1,0,0,1,0,1,1,1,1,0,1,0,1,0,1,0,0,1,3,1,0,0,1,1} 
    5 127465 2014-08-19 {0,1,0,0,1,0,1,1,1,0,0,1,2,0,1,0,0,1,1,0,0,1,1,1} 

我運行該腳本的一個例子是:

df$readings = gsub("[{}]", "", as.character(df$readings)) 
Read1 = strsplit(df$readings, ",") 
Readings = matrix(as.numeric(unlist(Read1)), nrow=length(Read1)) 
colMeans(Readings) 
+2

嘗試使用'data.table'或'dplyr' – Rentrop

+0

您創建的矩陣太大,這就是爲什麼您的內存不足。如果您只是對平均值感興趣,請在每一行上循環並保持每列的總數。最後除以nrow(df)。 – thc

+0

我一直只使用read.csv導入完整的數據幀... – peny

回答

0

如果你想堅持到你的輸入格式,這裏是一個可能爲你工作的解決方案。

第一個,安裝和加載包stringrdata.table

,提取號碼從讀數和創建數據表:

dt <- data.table(str_extract_all(df$readings,"[0-9]+", simplify=TRUE)) 

注意正則表達式[0-9]+假定整數值。

,轉換整個數據表從chr將數字:

dt <- dt[, lapply(.SD, as.numeric)] 

現在,使用dt[, lapply(.SD, mean)]來計算每一列的平均值。當然,您也可以使用lapply(dt, mean)

+0

謝謝。我無法在R服務器上安裝data.table,因爲根據錯誤消息,文件或目錄不存在。你知道這是爲什麼嗎? – peny

+0

很難說不知道確切的錯誤信息。如果還沒有,最好還是單獨提出一個問題。 –

+0

不幸的是,所提出的代碼不起作用,因爲R無法分配該大小的向量(19.5 Gb!)。還有其他建議嗎? – peny

相關問題