Как добавить переменную `df1 $ DateTime_1` в` df2`, когда `df1 $ DateTime_1` совпадает в течение 5-секундного интервала с` df2 $ DateTime_2` - PullRequest
0 голосов
/ 14 апреля 2020

У меня есть датафреймы df1 и df2. df1 суммирует различные моменты (df1$Theor.DateTime), в которые, теоретически, устройство отправляет информацию спутникам. Мы знаем это благодаря переменной df1$Delay, которая указывает интервал секунд между различными излучениями от устройства к спутникам. df2 суммирует конкретные c раз (df2$Real.DateTime), в которые спутники получали информацию об этом устройстве. Как видно из приведенного ниже примера, nrow(df2) меньше, чем nrow(df1), поскольку некоторые излучения не поступают на спутники по разным причинам. Вы также можете видеть, что df2$Real.DateTime не совпадает точно с df1$Theor.DateTime по разным причинам. Всегда есть задержка между излучением и приемом сигнала спутниками.

options("digits.secs" = 3)
df1 <- data.frame(Theor.DateTime= c("2018-03-22 12:00:00.000","2018-03-22 12:00:30.040","2018-03-22 12:01:15.800","2018-03-22 12:02:15.700","2018-03-22 12:02:45.350","2018-03-22 12:03:15.002","2018-03-22 12:04:00.065","2018-03-22 12:05:15.430","2018-03-22 12:06:00.060","2018-03-22 12:06:45.002"),
                  Delay= c(30,45,60,30,30,45,75,45,45,60))
df1$Theor.DateTime <- as.POSIXct(df1$Theor.DateTime, format="%Y-%m-%d %H:%M:%OS",tz="UTC")

head(df1)
           Theor.DateTime Delay
1 2018-03-22 12:00:00.000    30
2 2018-03-22 12:00:30.039    45
3 2018-03-22 12:01:15.799    60
4 2018-03-22 12:02:15.700    30
5 2018-03-22 12:02:45.349    30
6 2018-03-22 12:03:15.002    45


df2 <- data.frame(Real.DateTime= c("2018-03-22 12:00:02.000","2018-03-22 12:02:20.540","2018-03-22 12:02:42.800","2018-03-22 12:05:18.700","2018-03-22 12:06:33.700"))
df2$Theor.DateTime <- as.POSIXct(df1$Theor.DateTime, format="%Y-%m-%d %H:%M:%OS",tz="UTC")

df2
           Real.DateTime
1 2018-03-22 12:00:02.00
2 2018-03-22 12:02:20.53
3 2018-03-22 12:02:42.79
4 2018-03-22 12:05:18.70
5 2018-03-22 12:06:33.70

Я хочу создать кадр данных с информацией одновременно df1 и df2. Я хочу объединить в одной строке df1$Theor.DateTime и df2$Real.Datetime, когда df2$Real.Datetime находится в пределах 5-секундного интервала (+ - 5 секунд) относительно df1$Theor.DateTime. Я также хочу создать столбец с именем Reception.success, который указывает, совпадает ли указанный c df1$Theor.DateTime с df2$Real.Datetime (ИСТИНА или ЛОЖЬ), указывая, что излучение было получено.

Я бы ожидайте, что:

> df3
            Theor.DateTime Delay Reception.success           Real.DateTime
1  2018-03-22 12:00:00.000    30              TRUE 2018-03-22 12:00:02.000
2  2018-03-22 12:00:30.040    45             FALSE                    <NA>
3  2018-03-22 12:01:15.800    60             FALSE                    <NA>
4  2018-03-22 12:02:15.700    30              TRUE 2018-03-22 12:02:20.540
5  2018-03-22 12:02:45.350    30              TRUE 2018-03-22 12:02:42.800
6  2018-03-22 12:03:15.002    45             FALSE                    <NA>
7  2018-03-22 12:04:00.065    75             FALSE                    <NA>
8  2018-03-22 12:05:15.430    45              TRUE 2018-03-22 12:05:18.700
9  2018-03-22 12:06:00.060    45             FALSE                    <NA>
10 2018-03-22 12:06:45.002    60             FALSE                    <NA>

Кто-нибудь знает, как это получить?

Заранее спасибо

1 Ответ

1 голос
/ 14 апреля 2020

Может использовать функцию Non equi join в data.table

library(data.table)

options("digits.secs" = 3)
df1 <- data.table(Theor.DateTime= as.POSIXct(c("2018-03-22 12:00:00.000","2018-03-22 12:00:30.040","2018-03-22 12:01:15.800","2018-03-22 12:02:15.700","2018-03-22 12:02:45.350","2018-03-22 12:03:15.002","2018-03-22 12:04:00.065","2018-03-22 12:05:15.430","2018-03-22 12:06:00.060","2018-03-22 12:06:45.002"),format="%Y-%m-%d %H:%M:%OS",tz="UTC"),
                  Delay= c(30,45,60,30,30,45,75,45,45,60))
df2 <- data.table(Real.DateTime= as.POSIXct(c("2018-03-22 12:00:02.000","2018-03-22 12:02:20.540","2018-03-22 12:02:42.800","2018-03-22 12:05:18.700","2018-03-22 12:06:33.700"),format="%Y-%m-%d %H:%M:%OS",tz="UTC"))


df2[,`:=`(minus_5=Real.DateTime-5,
          plus_5=Real.DateTime+5)]


df2
#>             Real.DateTime                minus_5                 plus_5
#> 1: 2018-03-22 12:00:02.00 2018-03-22 11:59:57.00 2018-03-22 12:00:07.00
#> 2: 2018-03-22 12:02:20.53 2018-03-22 12:02:15.53 2018-03-22 12:02:25.53
#> 3: 2018-03-22 12:02:42.79 2018-03-22 12:02:37.79 2018-03-22 12:02:47.79
#> 4: 2018-03-22 12:05:18.70 2018-03-22 12:05:13.70 2018-03-22 12:05:23.70
#> 5: 2018-03-22 12:06:33.70 2018-03-22 12:06:28.70 2018-03-22 12:06:38.70


df1[df2,on = .(Theor.DateTime<=plus_5,Theor.DateTime>=minus_5),"Real.DateTime":=i.Real.DateTime][,"Reception.success":=!is.na(Real.DateTime)]

df1
#>              Theor.DateTime Delay          Real.DateTime Reception.success
#>  1: 2018-03-22 12:00:00.000    30 2018-03-22 12:00:02.00              TRUE
#>  2: 2018-03-22 12:00:30.039    45                   <NA>             FALSE
#>  3: 2018-03-22 12:01:15.799    60                   <NA>             FALSE
#>  4: 2018-03-22 12:02:15.700    30 2018-03-22 12:02:20.53              TRUE
#>  5: 2018-03-22 12:02:45.349    30 2018-03-22 12:02:42.79              TRUE
#>  6: 2018-03-22 12:03:15.002    45                   <NA>             FALSE
#>  7: 2018-03-22 12:04:00.065    75                   <NA>             FALSE
#>  8: 2018-03-22 12:05:15.430    45 2018-03-22 12:05:18.70              TRUE
#>  9: 2018-03-22 12:06:00.059    45                   <NA>             FALSE
#> 10: 2018-03-22 12:06:45.002    60                   <NA>             FALSE

Создано в 2020-04-14 пакетом prex (v0.3.0)

...