我有一个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
我希望我提供的信息足够,如果没有告诉我,我会尝试添加缺少的信息。
答案 0 :(得分:0)
我不能说我详细了解,为什么这个有效,但幸运的是:
[textEditor.clear() for textEditor in myGroupBox.findChildren(QtGui.QTextEdit)]
因此,如果要使用apply循环检查每个列和行,我必须使用apply吗?还是这样的事情也可以用lapply?
答案 1 :(得分:0)
不要用R循环它不是C. 这是如何有效替换数据框中的某些元素的示例。
num_calls = pivot_table[m][y]