有些值与组非常不同,因为缺少行并且数据不连续,这使我的diffVal不寻常。
> df
Date diffVal1 diffVal2
1 2017-05-31 04:01:00 718 483
2 2017-05-31 05:01:00 704 477
3 2017-05-31 06:01:00 741 478
4 2017-05-31 07:01:00 874 483
5 2017-05-31 08:01:00 907 495
6 2017-05-31 09:01:00 887 510
7 2017-05-31 10:01:00 2922 514
8 2017-05-31 13:01:00 1012 529
9 2017-05-31 14:01:00 979 539
10 2017-05-31 15:01:00 886 485
11 2017-05-31 16:01:00 818 471
您可以看到日期(小时;11,12)我需要将异常值平滑为正常值。
我正在尝试将异常值设置为 NULL,但问题是如果它是我的示例数据框,我如何将大数据框中的数据框中有异常值,我可以将超过 1200 的数据设置为 NA(这根本不是好主意,因为它不合理。 然后使用近似的 NA 值函数na.approx()
,我稍后必须得到这些图。
df$diffVal1 <- ifelse((df$diffVal1>1300), NA,df$diffVal1)
df$diffVal1 <- na.approx(df$diffVal1)
> df
Date diffVal1 diffVal2
1 2017-05-31 04:01:00 718.0 483
2 2017-05-31 05:01:00 704.0 477
3 2017-05-31 06:01:00 741.0 478
4 2017-05-31 07:01:00 874.0 483
5 2017-05-31 08:01:00 907.0 495
6 2017-05-31 09:01:00 887.0 510
7 2017-05-31 10:01:00 949.5 514
8 2017-05-31 13:01:00 1012.0 529
9 2017-05-31 14:01:00 979.0 539
10 2017-05-31 15:01:00 886.0 485
11 2017-05-31 16:01:00 818.0 471
这个问题应该怎么做?以及如何按日期添加缺失的行以近似再次添加?
非常感谢您的帮助。
告诉我这是否适合您:
数据准备 :
df <- read.table(text="Date; diffVal1; diffVal2
1; 2017-05-31 04:01:00; 718; 483
2; 2017-05-31 05:01:00; 704; 477
3; 2017-05-31 06:01:00; 741; 478
4; 2017-05-31 07:01:00; 874; 483
5; 2017-05-31 08:01:00; 907; 495
6; 2017-05-31 09:01:00; 887; 510
7; 2017-05-31 10:01:00; 2922; 514
8; 2017-05-31 13:01:00; 1012; 529
9; 2017-05-31 14:01:00; 979; 539
10; 2017-05-31 15:01:00; 886; 485
11; 2017-05-31 16:01:00; 818; 471",sep=";",header=TRUE,stringsAsFactors=FALSE)
df$Date <- as.POSIXct(df$Date)
df$diffVal1 <- as.numeric(df$diffVal1)
df$diffVal2 <- as.numeric(df$diffVal2)
all_dates <- data.frame(Date = seq(min(df$Date),max(df$Date),by=3600))
工作和结果 :
df2 <- df
df2 <- df2[order(df2$Date,decreasing=TRUE),]
df2$Val1_total <- cumsum(df2$diffVal1)
df2 <- merge(df2,all_dates,all.y = TRUE)
df2$Val1_total[is.na(df2$Val1_total)] <- approx(x = df2$Date, y = df2$Val1_total, xout = df2$Date[is.na(df2$Val1_total)])$y
df2$diffVal1 <- c(-diff(df2$Val1_total),tail(df2$diffVal1,1))
# > df2
# Date diffVal1 diffVal2 Val1_total
# 1 2017-05-31 04:01:00 718 483 11448
# 2 2017-05-31 05:01:00 704 477 10730
# 3 2017-05-31 06:01:00 741 478 10026
# 4 2017-05-31 07:01:00 874 483 9285
# 5 2017-05-31 08:01:00 907 495 8411
# 6 2017-05-31 09:01:00 887 510 7504
# 7 2017-05-31 10:01:00 974 514 6617
# 8 2017-05-31 11:01:00 974 NA 5643
# 9 2017-05-31 12:01:00 974 NA 4669
# 10 2017-05-31 13:01:00 1012 529 3695
# 11 2017-05-31 14:01:00 979 539 2683
# 12 2017-05-31 15:01:00 886 485 1704
# 13 2017-05-31 16:01:00 818 471 818