R 如何将无序值设置为NA?

R 如何将无序值设置为NA?,r,R,我用R来积累每分钟从传感器传来的数据。 “宽度”和“高度”应增加。 不幸的是,数据包含NAs和无序值(例如,第八行的值12.0、13.0超出范围)。 我想要的是将无序值设置为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 201212

我用R来积累每分钟从传感器传来的数据。 “宽度”和“高度”应增加。 不幸的是,数据包含NAs和无序值(例如,第八行的值12.0、13.0超出范围)。 我想要的是将无序值设置为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
然后我将自己估算数据集“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])
}
for语句的结果

   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宽度=NA,高度=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

更新。我最初的解决方案有两个缺陷:如果数据包含
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
这是一个很好的练习来理解为什么这样做有效。接下来定义一个函数

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

SetOutOfOrderValuesToNA每次运行函数时,这会对2个向量进行值比较吗?我的印象是@남윤주 如果我假设的是真的,那么可能只是做tail(data,x)并将x设置为一个合理的数字w.r.t.数据被大量输出的速率,并在其上运行函数。没问题。如果您认为此答案确实回答了您的问题,请“接受”此答案。@VictorK.,当我尝试此函数时,它不会捕获“宽度”列中出现问题的“12”。>x x[-1][x[-n]>x[-1]]x[1]1.12.2 3.3 NA 0.1 6.0 NA 7.0 8.0您能解决此问题吗?你能解释一下“x[-1][x[-n]>x[-1]]”代码的含义吗?我是R的乞丐。谢谢你~
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)