2017-02-16 6 views
0

У меня есть большой кадр данных, состоящий из 9 mio объектов на сервере RStudio со следующим форматом (есть много показаний для каждого 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

Если вы хотите придерживаться своего входного формата, здесь это решение, которое может работать для вас.

Первый, установить и загрузить пакеты stringr и data.table.

Второго, номера выписки из показаний и создавать таблицы данных:

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

Обратите внимание, что регулярное выражение [0-9]+ принимает целые значения.

Третий, преобразовать всю таблицу данных из Хра в цифровой:

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

Теперь используйте dt[, lapply(.SD, mean)] для вычисления среднего значения каждого отдельного столбца.

Вы также можете использовать lapply(dt, mean), конечно.

+0

Спасибо. Я не могу установить data.table на сервере R, поскольку файл или каталог не существует в соответствии с сообщением об ошибке. У вас есть идея, почему? – peny

+0

Трудно сказать, не зная точного сообщения об ошибке. Было бы лучше открыть отдельный вопрос, если его еще нет. –

+0

, к сожалению, предлагаемый код не работает либо потому, что R не может выделить вектор такого размера (19,5 Гб!). Любые другие предложения? – peny