2017-02-16 56 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

相关问题