Это приближение может быть хорошим:
Сначала я создал фрейм данных со всеми временными метками в желаемом интервале.
start = as.POSIXct("2018-09-04 10:56:12")
end = as.POSIXct("2018-09-04 10:57:12")
step = 3 #seconds (can be 2 seconds too!)
dummy.df <- seq(start, end, step)
dummy.df <- as.data.frame(dummy.df)
colnames(dummy.df) <- c("time")
Это выглядит так:
time
1 2018-09-04 10:56:12
2 2018-09-04 10:56:15
3 2018-09-04 10:56:18
4 2018-09-04 10:56:21
5 2018-09-04 10:56:24
6 2018-09-04 10:56:27
7 2018-09-04 10:56:30
8 2018-09-04 10:56:33
9 2018-09-04 10:56:36
10 2018-09-04 10:56:39
11 2018-09-04 10:56:42
12 2018-09-04 10:56:45
13 2018-09-04 10:56:48
14 2018-09-04 10:56:51
15 2018-09-04 10:56:54
16 2018-09-04 10:56:57
17 2018-09-04 10:57:00
18 2018-09-04 10:57:03
19 2018-09-04 10:57:06
20 2018-09-04 10:57:09
21 2018-09-04 10:57:12
Затем я создал поврежденный фрейм данных для имитации вашей проблемы:
#Lets say this is our original broken df, (with loses)
original.df <- dummy.df
original.df$V2 <- rnorm(nrow(original.df), 2,3) #Some fake data
original.df <- original.df[-c(5,6,10,15,16), ] #Introduce lost observations
colnames(original.df) <- c("time", "rain")
выглядит так
time rain
1 2018-09-04 10:56:12 2.0962818
2 2018-09-04 10:56:15 -4.6536048
3 2018-09-04 10:56:18 6.2995354
4 2018-09-04 10:56:21 -0.2378457
7 2018-09-04 10:56:30 3.8020177
8 2018-09-04 10:56:33 -5.7051945
9 2018-09-04 10:56:36 8.8737618
11 2018-09-04 10:56:42 3.9543532
12 2018-09-04 10:56:45 -3.8187967
13 2018-09-04 10:56:48 2.6197517
14 2018-09-04 10:56:51 8.3323757
17 2018-09-04 10:57:00 0.5615195
18 2018-09-04 10:57:03 1.4699787
19 2018-09-04 10:57:06 11.1171002
20 2018-09-04 10:57:09 0.7372780
21 2018-09-04 10:57:12 0.3441350
Далее я объединил кадры данных:
#Merge
df.merged<-merge(original.df, dummy.df, by = "time", all = T)
colnames(df.merged) <- c("time", "rain")
И я получаю:
time rain
1 2018-09-04 10:56:12 0.1243183
2 2018-09-04 10:56:15 -1.4254425
3 2018-09-04 10:56:18 3.1908882
4 2018-09-04 10:56:21 2.5210609
5 2018-09-04 10:56:24 NA
6 2018-09-04 10:56:27 NA
7 2018-09-04 10:56:30 -1.7984547
8 2018-09-04 10:56:33 1.0511725
9 2018-09-04 10:56:36 2.2908755
10 2018-09-04 10:56:39 NA
11 2018-09-04 10:56:42 -1.1524531
12 2018-09-04 10:56:45 1.2960848
13 2018-09-04 10:56:48 4.3809223
14 2018-09-04 10:56:51 0.1184004
15 2018-09-04 10:56:54 NA
16 2018-09-04 10:56:57 NA
17 2018-09-04 10:57:00 -3.3740135
18 2018-09-04 10:57:03 -7.1360918
19 2018-09-04 10:57:06 1.7078348
20 2018-09-04 10:57:09 -1.8903507
21 2018-09-04 10:57:12 2.5735402
Наконец, я интерполирую линейным методом, используя na.approx
:
#Interpolate NAs
df.merged$rain<-na.approx(df.merged$rain, method = "linear", rule=2)
И это желаемый вывод:
time rain
1 2018-09-04 10:56:12 0.1243183
2 2018-09-04 10:56:15 -1.4254425
3 2018-09-04 10:56:18 3.1908882
4 2018-09-04 10:56:21 2.5210609
5 2018-09-04 10:56:24 1.0812224
6 2018-09-04 10:56:27 -0.3586162
7 2018-09-04 10:56:30 -1.7984547
8 2018-09-04 10:56:33 1.0511725
9 2018-09-04 10:56:36 2.2908755
10 2018-09-04 10:56:39 0.5692112
11 2018-09-04 10:56:42 -1.1524531
12 2018-09-04 10:56:45 1.2960848
13 2018-09-04 10:56:48 4.3809223
14 2018-09-04 10:56:51 0.1184004
15 2018-09-04 10:56:54 -1.0457376
16 2018-09-04 10:56:57 -2.2098755
17 2018-09-04 10:57:00 -3.3740135
18 2018-09-04 10:57:03 -7.1360918
19 2018-09-04 10:57:06 1.7078348
20 2018-09-04 10:57:09 -1.8903507
21 2018-09-04 10:57:12 2.5735402