如何设置NA的无序值?

时间:2013-01-30 00:49:50

标签: r

我正在使用R来累积来自传感器的每分钟数据。 'WIDTH'和'HEIGHT'应该增加。 不幸的是,数据包含NA和无序值(例如,行8具有超出范围的值12.0,13.0)。 我想要的是将无序值设置为NA。

然后我将自己归咎于数据集'ex'。 由于数据可能很大, 我制作了如下程序:

m<-15 
for(i in 2:m){
  ex$WIDTH[i]<- ifelse(ex$WIDTH [i]- ex$WIDTH [i-1]<0,NA, ex$WIDTH [i])
  ex$HEIGHT[i]<- ifelse(ex$HEIGHT[i]- ex$HEIGHT [i-1]<0,NA, ex$HEIGHT [i])
}

但结果是错误的。

原始数据集

   ID    CTIME         WIDTH HEIGHT
1  HM001 201212121301 1201.9 1115.5
2  HM001 201212121302 1202.2 1115.8
3  HM001 201212121303 1202.8 1115.8
4  HM001 201212121304     NA 1116.1
5  HM001 201212121305 1203.9 1116.7
6  HM001 201212121306     NA 1116.7
7  HM001 201212121307     NA 1116.7
8  HM001 201212121308   12.0   31.0
9  HM001 201212121309 1206.0 1118.2
10 HM001 201212121310 1206.3 1118.6
11 HM001 201212121311 1206.5 1118.8
12 HM001 201212121312     NA     NA
13 HM001 201212121313 1207.3     NA
14 HM001 201212121314 1207.9 1121.1
15 HM001 201212121315 1208.4 1121.3

for statement

的结果
   ID    CTIME        ACTIVE_KWH REACTIVE_KWH
1  HM001 201212121301     1201.9       1115.5
2  HM001 201212121302     1202.2       1115.8
3  HM001 201212121303     1202.8       1115.8
4  HM001 201212121304         NA       1116.1
5  HM001 201212121305         NA       1116.7
6  HM001 201212121306         NA       1116.7
7  HM001 201212121307         NA       1116.7
8  HM001 201212121308         NA           NA
9  HM001 201212121309         NA           NA
10 HM001 201212121310         NA           NA
11 HM001 201212121311         NA           NA
12 HM001 201212121312         NA           NA
13 HM001 201212121313         NA           NA
14 HM001 201212121314         NA           NA
15 HM001 201212121315         NA           NA

我的期望(row8 WIDTH = NA,HEIGHT = NA)

   ID    CTIME         WIDTH HEIGHT
1  HM001 201212121301 1201.9 1115.5
2  HM001 201212121302 1202.2 1115.8
3  HM001 201212121303 1202.8 1115.8
4  HM001 201212121304     NA 1116.1
5  HM001 201212121305 1203.9 1116.7
6  HM001 201212121306     NA 1116.7
7  HM001 201212121307     NA 1116.7
8  HM001 201212121308     NA     NA
9  HM001 201212121309 1206.0 1118.2
10 HM001 201212121310 1206.3 1118.6
11 HM001 201212121311 1206.5 1118.8
12 HM001 201212121312     NA     NA
13 HM001 201212121313 1207.3     NA
14 HM001 201212121314 1207.9 1121.1
15 HM001 201212121315 1208.4 1121.3

1 个答案:

答案 0 :(得分:4)

<强>更新即可。我的原始解决方案有两个缺陷:如果数据包含NA s则不起作用,并且它不适用于两个连续的无序值。下面的解决方案解决了这两个问题;需要使用min的技巧,因为cummax没有na.rm参数。

SetOutOfOrderValuesToNA <- function(x) {
  min <- min(x, na.rm = TRUE)
  x[is.na(x)] <- min - 1
  x[x < cummax(x)] <- NA
  x
}

> x <- c(1.1, 2.2, 3.3, 0.1, NA, 0.1, 0.2, 0.3, 6, 0.2, 7, 8)
> SetOutOfOrderValuesToNA(x)
 [1] 1.1 2.2 3.3  NA  NA  NA  NA  NA 6.0  NA 7.0 8.0

原始解决方案。

让我们先从向量开始。如果

x <- c(1, 2, 3, 0.1, 4, 5, 6, 0.2, 7, 8)

然后以下代码将奇怪的(例如乱序)值设置为NA

n <- length(x)
x[-1][x[-n] > x[-1]] <- NA
> x
[1]  1  2  3 NA  4  5  6 NA  7  8

了解其工作原理是一个很好的练习。接下来定义一个函数

SetOutOfOrderValuesToNA <- function(x) {
  n <- length(x)
  x[-1][x[-n] > x[-1]] <- NA
  x
}

并在您的数据框中调用它:

ex$WIDTH <- SetOutOfOrderValuesToNA(ex$WIDTH)
ex$HEIGTH <- SetOutOfOrderValuesToNA(ex$HEIGHT)