Найти интервал, в котором число попадает в два кадра данных - PullRequest
1 голос
/ 01 апреля 2020

У меня есть два тибля: один имеет интервалы категории, а другой имеет вхождения каждой категории

int_df <- tibble(name = c(rep("John", 5), rep("Adam", 5)),
                 category = c(LETTERS[1:10]),
                 start = c(1, 14, 23, 35, 44, 52, 67, 75, 88, 91),
                 end = c(10, 20, 30, 40, 50, 60, 70, 80, 90, 100)
                 )

occ_df <- tibble(name = c(rep("John", 10), rep("Adam", 10)),
                 occurrence = c(1, 4, 8, 10, 12, 15, 27, 29, 34, 47,
                                52, 57, 64, 75, 78, 81, 82, 84, 86, 95)
                 )

Я хочу найти интервал в int_df, где вхождения из occ_df падают и верните название соответствующей категории. В случае, если вхождение не попадает в интервал, я хотел бы, чтобы вывод был «снаружи».

Вот ожидаемый результат

# A tibble: 20 x 3
   name  occurrence category
   <chr>      <dbl> <chr>   
 1 John           1 A       
 2 John           4 A       
 3 John           8 A       
 4 John          10 A       
 5 John          12 outside 
 6 John          15 B       
 7 John          27 C       
 8 John          29 C       
 9 John          34 outside 
10 John          47 E       
11 Adam          52 F       
12 Adam          57 F       
13 Adam          64 outside 
14 Adam          75 H       
15 Adam          78 H       
16 Adam          81 outside 
17 Adam          82 outside 
18 Adam          84 outside 
19 Adam          86 outside 
20 Adam          95 J

Я бы предпочел решение в tidyverse / dplyr / data.table

1 Ответ

2 голосов
/ 01 апреля 2020

Попробуйте:

library(data.table)

setDT(int_df)[setDT(occ_df), 
              .(name, occurrence, category = replace(category, is.na(category), 'outside')), 
              on = .(name, start <= occurrence, end >= occurrence)]

Вывод:

    name occurrence category
 1: John          1        A
 2: John          4        A
 3: John          8        A
 4: John         10        A
 5: John         12  outside
 6: John         15        B
 7: John         27        C
 8: John         29        C
 9: John         34  outside
10: John         47        E
11: Adam         52        F
12: Adam         57        F
13: Adam         64  outside
14: Adam         75        H
15: Adam         78        H
16: Adam         81  outside
17: Adam         82  outside
18: Adam         84  outside
19: Adam         86  outside
20: Adam         95        J
...