在存储在列表中的几列数据帧上使用函数(内存问题)

时间:2015-05-06 09:03:09

标签: r list memory lapply

我有一个51个数据帧的列表,总共90 MB,某些传感器测量的mV(第2列:第7列):

str(BoxlistF)

List of 51
$ :'data.frame':  33507 obs. of  7 variables:
  ..$ Date.Box                            : POSIXct[1:33507], format: "2013-01-01 00:15:00" ...
..$ Slnt.grn.00x.Box.001.SPADE.1: num [1:33507] 1811 1811 1810 1811 1810 ...
..$ Slnt.grn.00x.Box.001.SPADE.2: num [1:33507] 1739 1739 1737 1737 1736 ...
..$ Slnt.grn.00x.Box.001.SPADE.3: num [1:33507] 1634 1635 1634 1634 1637 ...
..$ Slnt.grn.00x.Box.001.SPADE.4: num [1:33507] 1572 1576 1576 1575 1576 ...
..$ Slnt.grn.00x.Box.001.SPADE.5: num [1:33507] 1660 1660 1659 1660 1659 ...
..$ Slnt.grn.00x.Box.001.SPADE.6: num [1:33507] 1454 1450 1453 1450 1451 ...

要删除测量错误,我想使用这个ifelse函数:

tt<-30
tb=-10
t<-2100
b<-800

l.new1<-lapply(BoxlistF, function(x){ x[,2:7]<-lapply(x[,2:7],function(x) ifelse(x<b|x>t,x<-NA,x))})

另一个尝试是排除函数的日期列:

lapply(BoxlistF, function(x) ifelse(x[,-1]<b|x[,-1]>t,x[,-1]<-NA,x[,-1]))

因为我的列名变化复杂,我想通过索引而不是名称来解决列。

我不知道这个函数是否正常工作,因为R中止抱怨内存问题..:

Error: cannot allocate vector of size 131 Kb
In addition: Warning messages:
1: In ifelse(x[, -1] < b | x[, -1] > t, x[, -1] <- NA, x[, -1]) :
  Reached total allocation of 8147Mb: see help(memory.size)
2: In ifelse(x[, -1] < b | x[, -1] > t, x[, -1] <- NA, x[, -1]) :
  Reached total allocation of 8147Mb: see help(memory.size)
Called from: top level 
Error during wrapup: cannot allocate vector of size 512 Kb
Error during wrapup: target context is not on the stack

在早期阶段,我有一个像这样的for循环:

for(i in 1:(length(BoxlistF)))
{for(j in 1:6)
{for(e in 1:(nrow(BoxlistF[[i]])))
  {
  ifelse((!is.na(BoxlistF[[i]][e,1+j])<b|!is.na(BoxlistF[[i]][e,1+j])>t),BoxlistF[[i]][e,1+j]<-NA,BoxlistF[[i]][e,1+j])
  ifelse((!is.na(BoxlistT[[i]][e,1+j])<tb|!is.na(BoxlistT[[i]][e,1+j])>tt),BoxlistT[[i]][e,1+j]<-NA,BoxlistT[[i]][e,1+j])
  }
}
}

这在月度数据上运作良好,但在这个大数据集(一年)上,我想它不是一个选项。

关于解决循环中的内存问题我发现这篇文章: Speed up the loop operation in R 我试图按照说明进行操作:

l.new1<-lapply(BoxlistF,function(x)
{ res <- numeric(nrow(x))
  for(ff in 2:7)
  {
  for(cc in 1:nrow(BoxlistF[[1]]))
  {ifelse(x[cc,ff]<b|x[cc,ff]>t,res[cc]<-NA,res[cc]<-x[cc,ff])
   x[,ff]<-res
   return(x)
  }}})

该功能工作得很快,但很难理解结果:

Date.Box    Slnt.grn.00x.Box.001.SPADE.1    Slnt.grn.00x.Box.001.SPADE.2    Slnt.grn.00x.Box.001.SPADE.3    Slnt.grn.00x.Box.001.SPADE.4    Slnt.grn.00x.Box.001.SPADE.5    Slnt.grn.00x.Box.001.SPADE.6
1   2013-01-01 00:15:00 1811    1739    1634    1572    1660    1454
2   2013-01-01 01:09:00 0   1739    1635    1576    1660    1450
3   2013-01-01 02:03:00 0   1737    1634    1576    1659    1453
4   2013-01-01 02:57:00 0   1737    1634    1575    1660    1450
5   2013-01-01 03:51:00 0   1736    1637    1576    1659    1451
6   2013-01-01 04:46:00 0   1739    1634    1575    1659    1451
7   2013-01-01 05:40:00 0   1734    1643    1576    1660    1450
8   2013-01-01 06:34:00 0   1734    1634    1576    1660    1449
9   2013-01-01 07:28:00 0   1734    1643    1572    1660    1447
10  2013-01-01 08:22:00 0   1734    1634    1576    1657    1448

我希望我提供的信息足够,如果没有告诉我,我会尝试添加缺少的信息。

2 个答案:

答案 0 :(得分:0)

我不能说我详细了解,为什么这个有效,但幸运的是:

[textEditor.clear() for textEditor in myGroupBox.findChildren(QtGui.QTextEdit)]

因此,如果要使用apply循环检查每个列和行,我必须使用apply吗?还是这样的事情也可以用lapply?

答案 1 :(得分:0)

不要用R循环它不是C. 这是如何有效替换数据框中的某些元素的示例。

num_calls = pivot_table[m][y]