0

有些值与组非常不同,因为缺少行并且数据不连续使我的 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

您可以看到 Date (hour;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

这个问题应该怎么办?以及如何按日期添加缺失的行以近似再次添加?

非常感谢您的帮助。

4

1 回答 1

0

告诉我这是否适合你:

数据准备:

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
于 2017-06-09T16:32:54.137 回答