我现在有全年每小时的温度数据。它的一小部分在这里
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应该有以下几列:日期临时妈二进制
谢谢。
我们需要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
您可以简单地将新的向量附加到您的数据框架上,即
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))