首页 > 解决方案 > 使用 dplyr 根据不同数据框中的条件过滤行数据框

问题描述

我有两个数据框:df1 和 df2(参见下面的示例)。df1 包含每个字符 id 的数字开始和结束值。df2 每个字符 id 包含多个事件,包括数字时间值。

library(dplyr)

df1 <- data_frame(id = c("A", "B"),
                  start = c(2, 3),
                  end = c(5, 9))

df2 <- data_frame(id = c(rep("A", 4), rep("B", 4)),
                  time = c(1, 3, 5, 8, 2, 3, 4, 10),
                  keep = c(FALSE, TRUE, TRUE, FALSE, FALSE, TRUE, TRUE, FALSE))

我正在尝试使用 dplyr 过滤 df2 中的事件,该时间值等于或介于 df1 中每个 id 的开始值和结束值之间。所以过滤器是 "df2$time >= df1$start & df2$time <= df1$end" 应该为每个 id 分别执行。我添加了一个逻辑列“keep”来显示我想在 df2 中保留哪些行。

如何为每个 id 执行此过滤器?最好使用 dplyr。这应该是最终结果:

df2 %>%
  filter(keep == TRUE)

任何帮助深表感谢!

标签: rdplyr

解决方案


像这样的东西呢,有dplyr

  df1 %>% 
  left_join(df2) %>%                       #joining to have one dataset
  filter(time <= end, time >= start) %>%   # filter, you can use <, > in case
  select(-c(2,3))                          # remove useless column if necessary

# A tibble: 4 x 3
  id     time keep 
  <chr> <dbl> <lgl>
1 A         3 TRUE 
2 A         5 TRUE 
3 B         3 TRUE 
4 B         4 TRUE 

推荐阅读