首页 > 解决方案 > 如何识别急剧增加/减少并使它们不适用的数据点?如何识别和消除异常值?

问题描述

我正在清理来自多个温度传感器的数据。我正在尝试编写代码来查找数据相对于相邻数据点急剧增加或减少的位置,并使该点为 NA/null。

我试图用一个 for 循环和几个 if 语句来做到这一点,但这种方法似乎存在一些问题。也就是说,if 语句实际上不适用于 NA 值。因此,如果循环的第一部分因为增加太多而使其中一个条目成为 NA,则第二部分将返回错误,因为它正在尝试使用 NA 条目执行操作。

我宁愿将异常值设为 NA 而不是删除条目,因为我希望稍后可以选择用相邻值的平均值替换 NA 值。

有谁知道一种不同的方法来识别/消除变化太大/异常数据的数据?


#maximum change per sampling interval 
c<- 1.5   
#make datapoints that increased/decreased too much from the previous datapoint NA
                for(x in 2: length(cleandata)){

                if((cleandata$tempdiff[x] - cleandata$tempdiff[x-1])>=c) cleandata$tempdiff<-NA
                if((cleandata$tempdiff[x-1]-cleandata$tempdiff[x])>=c) cleandata$tempdiff<-NA
                }

这是数据集的简化部分:

structure(list(TIMESTAMP = structure(c(1594911720, 1594911780, 
1594911840, 1594911900, 1594911960, 1594127280, 1594127340, 1594127400, 
1594127460, 1594127520, 1594127580), tzone = "", class = c("POSIXct", 
"POSIXt")), sensor = c("TempDiffs.1.", "TempDiffs.1.", "TempDiffs.1.", 
"TempDiffs.1.", "TempDiffs.1.", "TempDiffs.2.", "TempDiffs.2.", 
"TempDiffs.2.", "TempDiffs.2.", "TempDiffs.2.", "TempDiffs.2."
), tempdiff = c(10.45, 12.5, 10.52, 10.48, 10.48, 12.47, 12.48, 
12.49, 12.5, 12.52, 12.52)), row.names = c(NA, -11L), groups = structure(list(
    sensor = c("TempDiffs.1.", "TempDiffs.2."), .rows = structure(list(
        1:5, 6:11), ptype = integer(0), class = c("vctrs_list_of", 
    "vctrs_vctr", "list"))), row.names = 1:2, class = c("tbl_df", 
"tbl", "data.frame"), .drop = TRUE), class = c("grouped_df", 
"tbl_df", "tbl", "data.frame"))

我对这个过程的另一个担忧是传感器之间的转换。我的数据被格式化为长/高。因此,有一列标识传感器,另一列包含温度数据。每个传感器都有不同的“典型范围”温度。因此,当从一个传感器切换到下一个传感器时,此代码可能会使数据无效,因为它会发生巨大变化。我想解决这个问题的一种方法是在消除异常值之前按传感器列对数据进行分组。我将不胜感激任何建议!

标签: rfor-loopnadata-cleaningoutliers

解决方案


我认为这应该有效。

c <- 1.5
d <- abs(cleandata$tempdiff[2:nrow(cleandata)] - cleandata$tempdiff[1:(nrow(cleandata)-1)])
d <- which(d > c)
cleandata$tempdiff[d] <- NA
d <- d + 1
cleandata$tempdiff[d] <- NA

> cleandata
             TIMESTAMP       sensor tempdiff
1  2020-07-16 11:02:00 TempDiffs.1.    10.45
2  2020-07-16 11:03:00 TempDiffs.1.    11.50
3  2020-07-16 11:04:00 TempDiffs.1.    10.52
4  2020-07-16 11:05:00 TempDiffs.1.    10.48
5  2020-07-16 11:06:00 TempDiffs.1.       NA
6  2020-07-07 09:08:00 TempDiffs.2.       NA
7  2020-07-07 09:09:00 TempDiffs.2.    12.48
8  2020-07-07 09:10:00 TempDiffs.2.    12.49
9  2020-07-07 09:11:00 TempDiffs.2.    12.50
10 2020-07-07 09:12:00 TempDiffs.2.    12.52
11 2020-07-07 09:13:00 TempDiffs.2.    12.52

推荐阅读