将超出范围的值设置为NA

时间:2013-01-28 10:50:32

标签: r

我有一个类似下面的数据集。 传感器每分钟评估一次数据。 WEIGHT是一个因变量。 TIME表示小时/分钟。这些数据将累积多年。 问题是row[4]。在这一行,重量有一个奇怪的值(它是在...之外 范围),由传感器误差发生。你必须提醒任何人都不能指望什么时候会发生奇怪的值。

我想要的是制作如下所示的程序。 1.使用方法,设置方差范围(设定范围从10到50) 2.使用for(i)语句,检查方差(权重)是否在范围内。 3.当方差超出范围时,将权重[i]归为NA。

 ID      TIME   WEIGHT
HM001   1223    24.9
HM001   1224    25.2
HM001   1225    25.5
HM001   1226    12233
HM001   1227    25.7
HM001   1228    27.1

3 个答案:

答案 0 :(得分:4)

如果您的数据位于名为d的数据框中,则可以使用:

d$WEIGHT[d$WEIGHT<10 | d$WEIGHT>50] <- NA

你不应该使用for循环,而是使用矢量索引来完成这类任务。

答案 1 :(得分:3)

您可以使用withinis.na<-来解决此问题。假设您的数据框名为dat

within(dat, is.na(WEIGHT) <- WEIGHT < 10 | WEIGHT > 50)

     ID TIME WEIGHT
1 HM001 1223   24.9
2 HM001 1224   25.2
3 HM001 1225   25.5
4 HM001 1226     NA
5 HM001 1227   25.7
6 HM001 1228   27.1

答案 2 :(得分:1)

因为我无法抗拒:

fooweight<-runif(1e6)
wfun1<-function(x) x[x<.1 | x>.5] <- NA
wfun2<-function(x)  is.na(x) <- (x < .10 | x > .50)
microbenchmark(wfun1(fooweight),wfun2(fooweight),times=100)

Unit: milliseconds
              expr      min       lq   median       uq      max
1 wfun1(fooweight) 45.00671 47.68492 49.27120 50.28852 152.4313
2 wfun2(fooweight) 47.74992 51.05204 51.89938 53.00629 156.0306

对不起,斯文,你输了大约5%的朱巴: - )