R中是否有一种方法可以根据不同数据帧中的范围来过滤一个数据帧中的数据?

时间:2020-03-17 21:12:47

标签: r

我有一个来自视频重新编码的数据集,其中记录了大量数据,同时还记录了以毫秒为单位的视频计时。我还在单独的CSV文件中提供了我感兴趣的视频部分的特定帧号。我希望仅使用我感兴趣的区域内的数据制作一个新的数据集。

我目前已经通过从我的第一个数据框中提取时间并在其中输入时间来手动完成此操作(下面的示例)。然后,我使用rbind重新组合了数据帧,但是考虑到我拥有的数据量,这样做很难实现。我非常感谢您的协助。谢谢!

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

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

2 个答案:

答案 0 :(得分:1)

我们可以使用map2遍历向量和filter数据

library(dplyr)
library(purrr)
lst1 <- map2(c(379909, 398802), c(387176, 406488), ~ data %>%
            filter(between(start.time, .x, .y)))

答案 1 :(得分:1)

我不确定您的数据的确切结构,但这也许会有所帮助。如果我不赞成这样做,我会道歉(并会立即删除答案)。

假设您有两个数据帧,一个数据帧以毫秒为单位startend次,第二个数据帧以特定的start.time毫秒为单位。

使用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)
)

输出:分别使用dplyrdata.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