Как вернуть значение из другой таблицы, если между двумя разами? - PullRequest
0 голосов
/ 25 апреля 2020

У меня есть набор данных, который просматривает моменты, когда происходил определенный «прогон». Это глава () набора данных.

time <- c(15:27.7, 15:27.7, 15:27.8, 15:27.9, 15:28.0) 

I wi sh для возврата «номера цикла», для которого, если значение во времени находится между определенным временем в кадре данных, он вернет соответствующий цикл. Таблица поиска находится ниже.

START   END       Run
  <fct>   <fct>   <int>
1 15:27.7 15:29.1     1
2 20:32.3 20:37.3     2
3 25:57.3 25:58.7     3
4 17:53.8 17:54.0     4

Мой желаемый результат запуска должен быть:

  TIME     Run
1 15:27.7   1
2 15:27.7   1
3 15:27.8   1
4 15:27.9   1
5 15:28.0   1

Я полагаю, что мне может понадобиться изменить формат времени, но я не уверен, как это сделать.

Любая помощь будет принята с благодарностью.

1 Ответ

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

Да - вам придется преобразовать все ваши «времена», которые выглядят как факторы в вашей таблице поиска, в объекты класса даты / времени или «POSIXct», чтобы вы могли затем искать значения. Функция as.POSIXct может сделать это за вас.

df$time2 <- as.POSIXct(df$time, format="%M:%OS")
lkup$START <- as.POSIXct(lkup$START, format="%M:%OS")
lkup$END <- as.POSIXct(lkup$END, format="%M:%OS")

Затем используйте один из многих методов для поиска значения Run из таблицы поиска на основе значения времени в вашем основном фрейме данных. Здесь я буду использовать неэквивалентное объединение таблицы данных, поскольку оно довольно просто.

library(data.table)
setDT(lkup)[setDT(df), on=.(START<=time2, END>=time2), .(id, time, Run)]
   id    time Run
1:  1 15:27.7   1
2:  2 15:29.1   1
3:  3 20:32.3   2
4:  4 25:58.7   3
5:  5 17:53.9   4

Данные :

df <- structure(list(id = 1:5, time = c("15:27.7", "15:29.1", "20:32.3", 
"25:58.7", "17:53.9")), class = "data.frame", row.names = c(NA, 
-5L))

  id    time
1  1 15:27.7
2  2 15:29.1
3  3 20:32.3
4  4 25:58.7
5  5 17:53.9 

lkup <- structure(list(START = c("15:27.7", "20:32.3", "25:57.3", "17:53.8"
), END = c("15:29.1", "20:37.3", "25:58.7", "17:54.0"), Run = 1:4), class = "data.frame", row.names = c("1", 
"2", "3", "4"))

    START     END Run
1 15:27.7 15:29.1   1
2 20:32.3 20:37.3   2
3 25:57.3 25:58.7   3
4 17:53.8 17:54.0   4
...