gpt4 book ai didi

r - 如何将乱序值设置为 NA?

转载 作者:行者123 更新时间:2023-12-04 11:04:26 24 4
gpt4 key购买 nike

我正在使用 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语句的结果

   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

我期望的(第 8 行 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

最佳答案

更新。我原来的解决方案有两个缺陷:如果数据包含 NA 则它不起作用,并且它对两个连续的乱序值不起作用。下面的解决方案解决了这两个问题; 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)

关于r - 如何将乱序值设置为 NA?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14594899/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com