Объединить 2 кадра данных со столбцом dateTime в df.x, отфильтрованном по dateStart dateEnd в df.y? - PullRequest
2 голосов
/ 02 октября 2019

У меня есть набор данных с начальным и конечным временем для событий (называемый df_time) и другой набор данных, когда произошло событие (df_val). Я хочу выполнить внутреннее объединение двух фреймов данных о том, имело ли место df_val в двух столбцах df_time.

start = c(1, 5, 7, 4)
end = c(2, 7, 11, 7)
event_id = c('a', 'b', 'c', 'd')
df_time = data.frame(start, end, event_id)

time = c(3, 6, 2, 10, 11)
val = c(100, 20, 30, 40, 50)
df_val = data.frame(time, val)

Мне известно о map2_dfr, и я использую его как таковой:

library(tidyverse)

unique(  map2_dfr(  df_time$start, df_time$end,
                    ~filter(df_val, time >= .x, time <= .y)  )  )

Однако это возвращает мне только столбцы в df_val;есть ли способ вернуть столбцы из df_time для вывода вроде:

  time val  start end event_id
1    2  30  1     2   'a'
2    6  20  5     7   'b'
3   10  40  7     11  'c'
4   6   50  4     7   'd'

Редактировать: setDT очень близок к правильному ответу! Тем не менее, df_time имеет значения для val и время для строк, которые не имеют соответствующих значений в df_val, вместо того, чтобы быть полностью опущенными. Например, учитывая приведенный ниже случай 2:

Case 2

time=c(3,6,10,11)
val=c(100,20,40,50)
df_val=data.frame(time,val)

start = c(1, 5, 7, 4)
end = c(2, 7, 11, 7)
event_id = c('a', 'b', 'c', 'd')
df_time = data.frame(start, end, event_id)

setDT(df_time)[df_val, c("val", "time")  := .(val, time) , 
         on = .(start <= time,  end >= time)]

df_time

Вывод:

df_time
start   end   event_id   val   time
1       2     a          NA    NA
5       7     b          20    6
7       11    c          50    11
4       7     d          20    6

Ожидаемый / правильный вывод:

start   end   event_id   val   time
5       7     b          20    6
7       11    c          50    11
4       7     d          20    6

1 Ответ

1 голос
/ 02 октября 2019

Опция - неэквивалентное объединение в data.table. Преобразуйте файл «data.frame» в «data.table» (setDT(df_time)), объедините его со столбцами «df_val» on non-equi (<=, >=) и назначьте (:=) соответствующие'val' и 'time', которые соответствуют новым столбцам в 'df_time'

library(data.table)
na.omit(setDT(df_time)[df_val, c("val", "time")  := .(val, time) , 
         on = .(start <= time,  end >= time)])
#.  start end event_id val time
#1:     5   7        b  20    6
#2:     7  11        c  50   11
#3:     4   7        d  20    6
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...