r - 如何识别急剧增加/减少并使它们不适用的数据点?如何识别和消除异常值?
问题描述
我正在清理来自多个温度传感器的数据。我正在尝试编写代码来查找数据相对于相邻数据点急剧增加或减少的位置,并使该点为 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"))
我对这个过程的另一个担忧是传感器之间的转换。我的数据被格式化为长/高。因此,有一列标识传感器,另一列包含温度数据。每个传感器都有不同的“典型范围”温度。因此,当从一个传感器切换到下一个传感器时,此代码可能会使数据无效,因为它会发生巨大变化。我想解决这个问题的一种方法是在消除异常值之前按传感器列对数据进行分组。我将不胜感激任何建议!
解决方案
我认为这应该有效。
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
推荐阅读
- opencv - 轮廓不会检测到另一个对象内部的对象
- javascript - 是否有诸如“打包的网络应用程序”之类的东西?
- css - CSS背景色过渡不适用于其他过渡
- require - Angular 6 :: 找不到名称'require'
- c# - 在按钮下放置一个弹出窗口(UWP、XAML、C#)
- json - 将 json 数组解析为 QMatrix4x4
- silverstripe - Silverstripe 4 tinyMCE 不工作
- angular - 如何使用具有相同登录凭据的两个示例 Angular 应用程序实现单点登录
- sparql - ttl 和 SPARQL 中的一对多关系定义-生成嵌套的 GENERATE
- node.js - 如何根据域名配置视图路径?