【问题标题】:moving averages then binarise if > then MA如果 > 则移动平均线然后二值化 MA
【发布时间】:2021-10-08 09:57:17
【问题描述】:

我目前有全年每小时的温度数据。它的一小部分在这里

Date     Temp
1/1/21   11
2/1/21   12
3/1/21   13
4/1/21   14
5/1/21   15
6/1/21   10
7/1/21   11
8/1/21   12
9/1/21   16
10/1/21  15 

从这个社区,我知道要计算移动平均线,我会这样做

matemp <- zoo::rollmean(x = df$Temp, k = 2, align = "left", fill = NA )

Q1:如果我想显示新的 df,会是这样吗

newdf <- c(df, matemp)

这会产生一个列表而不是一个向量?

我知道长度有所不同,但不确定人们如何处理它。

Q2:从这里开始,我希望使用以下标准来识别异常值,如果温度大于 MA,则返回 1,否则返回 0。管道在这里最有意义吗?

最终的 df 应该有以下列: 日期 温度 嘛 二进制

谢谢。

【问题讨论】:

    标签: r date zoo


    【解决方案1】:

    您可以简单地将新向量附加到您的数据框,即

    df$MA <- zoo::rollmean(x = df$Temp, k = 2, align = "left", fill = NA )
    df$Binary <- as.integer(df$MA < df$Temp)
    
    df
    #      Date Temp   MA Binary
    #1   1/1/21   11 11.5      0
    #2   2/1/21   12 12.5      0
    #3   3/1/21   13 13.5      0
    #4   4/1/21   14 14.5      0
    #5   5/1/21   15 12.5      1
    #6   6/1/21   10 10.5      0
    #7   7/1/21   11 11.5      0
    #8   8/1/21   12 14.0      0
    #9   9/1/21   16 15.5      1
    #10 10/1/21   15   NA     NA
    

    【讨论】:

      【解决方案2】:

      对于这样的任务,我建议取消 tidyverses dplyr 包:

      library(dplyr)
      
      # data
      df <- 
        tibble(Date = seq(from = as.Date('2021-01-01'), to = as.Date('2021-01-10'), by=1),
               Temp = c(11,12,13,14,15,10,11,12,16,15))
      
      # calculations
      df %>% 
        mutate(MA = (Temp + lead(Temp)) / 2,
               outlier = if_else(Temp > MA, 1L, 0L))
      

      【讨论】:

      • 您可以使用 1 * (Temp &gt; MA) 作为此 if_else 语句的简单替代方案,但您的 MA 与 OP 的 matemp 不匹配。
      • 谢谢@MartinGal,我误解了 rollmean 语句。现在我的计算与 OP 匹配(虽然我不确定这个计算是否是有意的?)
      【解决方案3】:

      我们需要 cbind 而不是 c:

      matemp <- zoo::rollmean(x = df$Temp, k = 2, align = "left", fill = NA )
      
      # use cbind to add new columns, then assign to a newdf
      newdf <- cbind(df, MA = matemp, Binary = as.integer(matemp < df$Temp))
      
      newdf
      #          Date Temp   MA Binary
      # 1  2021-01-01   11 11.5      0
      # 2  2021-01-02   12 12.5      0
      # 3  2021-01-03   13 13.5      0
      # 4  2021-01-04   14 14.5      0
      # 5  2021-01-05   15 12.5      1
      # 6  2021-01-06   10 10.5      0
      # 7  2021-01-07   11 11.5      0
      # 8  2021-01-08   12 14.0      0
      # 9  2021-01-09   16 15.5      1
      # 10 2021-01-10   15   NA     NA
      

      【讨论】:

      • 转换也可以在创建matemp...transform(df, MA = matemp, Binary = as.integer(matemp &lt; df$Temp))
      猜你喜欢
      • 2020-04-10
      • 2014-05-24
      • 2017-09-01
      • 1970-01-01
      • 2013-12-22
      • 2019-02-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多