根据另一个 tibble 过滤 mutate 中的一个 tibble?

Filter a tibble in mutate based on another tibble?

我有两个 tibbles,ranges 和 sites。第一个包含一组坐标(区域、开始、结束以及其他字符变量),另一个包含一个站点(区域、站点)。我需要获取第二个小标题中第一个小标题中给定范围(行)内的所有站点。使事情复杂化的是,第一个小标题中的范围重叠。

# Range tibble
  region start end var_1 ... var_n
1  A     1     5   
2  A     3     10
3  B     20    100
# Site tibble
  region site 
1  A     4        
2  A     8    
3  B     25

大约 10 亿个站点的 ~200,000 个范围可能长达 100,000 秒,所以我不喜欢我的想法,即列出范围内所有值的列表,取消嵌套,semi_join' ing、分组和总结(a_list = list(site))'ing.

我希望得到类似以下内容的东西:

range_tibble %>%
  rowwise %>%
  mutate(site_list = site_tibble %>%
                filter(region.site == region.range, site > start, site < end) %>%
      .$site %>% as.list))

产生像这样的小标题:

# Final tibble
 region start   end    site_list  var_1 ... var_n    
  <chr>  <dbl> <dbl>   <list>     <chr>     <chr>
  1 A          1     5 <dbl [1]>
  2 A          3    10 <dbl [2]>
  3 B         20   100 <dbl [1]>

我已经看到使用外部变量的 "gets" 的答案(即 filter(b == get("b")),但是我如何从当前行中获取变量range tibble?我没有想到任何巧妙的管道或语法?完全不同的方法也很棒,只要它能很好地处理大数据并且可以变回 tibble。

使用left_join()合并两个数据框,使用summarise()连接指定范围内的站点。

library(dplyr)

range %>%
  left_join(site) %>%
  filter(site >= start & site <= end) %>% 
  group_by(region, start, end) %>%
  summarise(site = list(site))

#   region start   end site     
#   <fct>  <dbl> <dbl> <list>   
# 1 A          1     5 <dbl [1]>
# 2 A          3    10 <dbl [2]>
# 3 B         20   100 <dbl [1]>

数据

range <- data.frame(region = c("A", "A", "B"), start = c(1, 3, 20), end = c(5, 10, 100))
site <- data.frame(region = c("A", "A", "B"), site = c(4, 8, 25))