r语言 - 移动平均线,然后二元化,如果>则MA



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

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 )
问题1:如果我想显示新的df,它会是 吗?
newdf <- c(df, matemp)

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

我知道长度有差异,但不知道人们是怎么处理的。

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

最后的df应该有以下几列:日期临时妈二进制

谢谢。

我们需要cbindc:

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

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

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

对于这样的任务,我建议使用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))

相关内容

最新更新