【问题标题】:Compute mean and remove outliers from data divided by hours in r计算平均值并从数据中去除异常值除以 r 中的小时数
【发布时间】:2018-09-13 17:15:21
【问题描述】:

part of data我正在尝试从大型数据集(4 个月的数据)中计算每小时测量值的平均值(大约每小时 20 次),但我需要删除每小时定义为 2SD 的异常值远离每小时平均值。

structure(list(YEAR = c(2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 
2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 
2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 
2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 
2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 
2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 2018L), MONTH = c(1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L), DAY = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L), HOUR = c(0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 1L, 1L, 
1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 3L), MINUTE = c(1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L
), SECOND = c(0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L), Tmp = c(25.6984, 25.6967, 25.6962, 25.6962, 
25.6955, 25.6949, 25.6959, 25.6944, 25.6954, 25.6954, 25.6958, 
25.6958, 25.6962, 25.6967, 25.6982, 25.6976, 25.6978, 25.6977, 
25.6975, 25.6979, 25.5552, 25.5577, 25.5579, 25.5573, 25.746, 
25.7248, 25.7164, 25.7249, 25.7379, 25.752, 25.7502, 25.7678, 
25.7805, 25.7871, 25.7863, 25.7856, 25.7948, 25.7939, 25.7953, 
25.7969, 25.7982, 25.7981, 25.7972, 25.7978, 25.644, 25.6451, 
25.6455, 25.6456, 25.6451, 25.6454)), row.names = c(NA, 50L), class = "data.frame")

【问题讨论】:

  • 听起来逻辑清晰,但我们需要一些数据来帮助您。
  • 我添加了部分数据的图片。如您所见,我有按月、日和分钟分隔的列。
  • 不是很有帮助,因为我必须自己输入数据。 :) 你可以使用dput() 并在此处发布输出吗?看看mtcars的前3行是如何查找的:dput(mtcars[1:3,])
  • 更好吗?这只是数据的一部分,我还有更多列...
  • 您发布的部分数据没有足够的变化,所以我手动更改了一个值以创建异常值。希望我的回答有帮助...

标签: r aggregate average outliers


【解决方案1】:

我正在使用您发布为 df 的数据。

library(tidyverse)

# manually changing first value to create an outlier
df$Tmp[1] = 60

df %>%
  group_by(HOUR) %>%
  mutate(MEAN = mean(Tmp),
         SD = sd(Tmp),
         IsOutlier = ifelse(Tmp < MEAN-2*SD | Tmp > MEAN+2*SD, 1, 0)) %>%
  ungroup()

# # A tibble: 50 x 10
#    YEAR MONTH   DAY  HOUR MINUTE SECOND   Tmp  MEAN    SD IsOutlier
#   <int> <int> <int> <int>  <int>  <int> <dbl> <dbl> <dbl>     <dbl>
# 1  2018     1     1     0      1      0  60    27.4  7.67         1
# 2  2018     1     1     0      1      0  25.7  27.4  7.67         0
# 3  2018     1     1     0      1      0  25.7  27.4  7.67         0
# 4  2018     1     1     0      1      0  25.7  27.4  7.67         0
# 5  2018     1     1     0      1      0  25.7  27.4  7.67         0
# 6  2018     1     1     0      1      0  25.7  27.4  7.67         0
# 7  2018     1     1     0      1      0  25.7  27.4  7.67         0
# 8  2018     1     1     0      1      0  25.7  27.4  7.67         0
# 9  2018     1     1     0      1      0  25.7  27.4  7.67         0
#10  2018     1     1     0      1      0  25.7  27.4  7.67         0
# # ... with 40 more rows

您可以看到第一行被归类为异常值行,您可以在稍后阶段使用... %&gt;% filter(IsOutlier == 0) 将其删除。

我留下了我创建的列,以便了解该过程是如何工作的。

【讨论】:

  • 成功了!但是如何转换为新的数据框?第二部分(去除异常值)也不清楚......
  • 使用filter回答提及。
  • 您可以将整个过程保存为 df2(您的新数据框)。您可以在要过滤掉异常值的过程结束时添加最后一部分。
  • 是的!我需要做一些小改动(创建一个包含十进制数据的列),但效果很好,非常感谢
【解决方案2】:

考虑基础 R 的 ave(来自用于内联聚合的内置 stats 库)来计算 离群值

df$outlier <- ave(df$Tmp, df$HOUR, 
                  FUN=function(x) (x < (mean(x) - sd(x)*2)) | (x > (mean(x) + sd(x)*2)))

然后相应地设置子集:

subdf <- subset(df, outlier == 0)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-02-05
    • 1970-01-01
    • 2011-06-07
    • 2014-12-02
    • 2019-08-17
    • 2021-02-27
    • 2012-05-21
    相关资源
    最近更新 更多