Отфильтровать тиббл в мутировании на основе другого тиббла? - PullRequest
0 голосов
/ 03 февраля 2019

У меня есть два тибля, диапазоны и места.Первая содержит набор координат (регион, начало, конец и другие символьные переменные), а другая содержит сайты (регион, сайт).Мне нужно получить все сайты во втором столбце, которые попадают в заданный диапазон (ряд) в первом столбце.Сложные вопросы, диапазоны в первом стакане перекрываются.

# 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

Диапазон ~ 200 000 может длиться 100 000 с более чем на миллиарде сайтов, поэтому мне не нравится моя идея составить список всех значений в диапазоне, unnesting, 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]>

Я видел ответы, использующие "get" внешней переменной (то есть filter (b == get ("b")), но как бы я получил переменную из текущей строки в диапазоне tibble«Любые умные каналы или синтаксис, о которых я не думаю». Также отлично подходит совершенно другой подход, если он хорошо работает с большими данными и может быть превращен в тиббл.

1 Ответ

0 голосов
/ 03 февраля 2019

Данные

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

Код

Используйте left_join() для объединения двух фреймов данных и summarise() для объединения сайтов, содержащихсяв указанном диапазоне.

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]>
...