Есть ли способ в R для фильтрации данных из одного кадра данных на основе диапазона из другого кадра данных? - PullRequest
1 голос
/ 18 марта 2020

У меня есть набор данных из перекодирования видео с широким массивом данных, записанных наряду с синхронизацией видео в миллисекундах. У меня также есть определенные c номера кадров интересующих меня разделов видео в отдельном файле CSV. Я надеюсь создать новый набор данных, содержащий только те данные, которые попадают в мои области интересов.

В настоящее время я делал это вручную, извлекая времена из моего первого кадра данных и вводя их (пример ниже). Затем я повторно скомбинировал кадры данных, используя rbind, но это не реально c, чтобы продолжить выполнение, учитывая количество данных, которые у меня есть. Я действительно ценю любую помощь. Спасибо!

data1 <- dplyr::filter(data, between(data$start.time, 379909, 387176))

data2 <- dplyr::filter(data, between(data$start.time, 398802, 406488))

Ответы [ 2 ]

1 голос
/ 18 марта 2020

Я не уверен, как именно ваши данные структурированы, но, возможно, это может быть полезно. Если я не согласен с этим, приношу свои извинения (и быстро удалю ответ).

Скажем, у вас есть два фрейма данных, один с start и end раз в mse c, а второй с указанными c start.time mse c значениями.

С помощью dplyr вы можете сделать:

library(dplyr)

vid_data %>%
  mutate(flag = 1) %>%
  full_join(data %>% mutate(flag = 1), by = "flag") %>%
  dplyr::filter(between(start.time, start, end)) %>%
  distinct() %>%
  dplyr::select(-flag)

С большим количеством данных вы можете сделать что-то быстрее с data.table:

library(data.table)

setDT(vid_data)
setDT(data)

vid_data[data, on = .(start < start.time, end > start.time), .(id, frame, start.time), nomatch = 0]

Пример данных :

vid_data <- data.frame(
  id = 1:3,
  start = c(380000, 398000, 401000),
  end = c(387000, 406000, 412000)
)

data <- data.frame(
  frame = c(1,2,3,4,5),
  start.time = c(379000,381000,385000,403000,410000)
)

Выход : С dplyr и data.table соответственно:

id  start    end frame start.time
1  1 380000 387000     2     381000
2  1 380000 387000     3     385000
3  2 398000 406000     4     403000
4  3 401000 412000     4     403000
5  3 401000 412000     5     410000

   id frame start.time
1:  1     2     381000
2:  1     3     385000
3:  2     4     403000
4:  3     4     403000
5:  3     5     410000
1 голос
/ 18 марта 2020

Мы можем использовать map2 до l oop над векторами и filter данные

library(dplyr)
library(purrr)
lst1 <- map2(c(379909, 398802), c(387176, 406488), ~ data %>%
            filter(between(start.time, .x, .y)))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...