【问题标题】:Find the interval in which a number falls across two data frames找出一个数字落在两个数据帧中的区间
【发布时间】:2020-04-01 12:30:03
【问题描述】:

我有两个小标题:一个有一个类别的间隔,另一个有每个类别的出现次数

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 中的解决方案

【问题讨论】:

    标签: r dplyr data.table tidyverse


    【解决方案1】:

    试试:

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-08-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-08
      • 2020-09-18
      • 2019-03-16
      相关资源
      最近更新 更多