【问题标题】:Amount of overlap of two ranges in R [DescTools?]R [DescTools?] 中两个范围的重叠量
【发布时间】:2021-03-25 16:17:12
【问题描述】:

我需要知道两个数字范围重叠了多少个整数。我尝试使用 DescTools::Overlap,但输出不是我所期望的。

library(DescTools)
library(tidyr)

df1 <- data.frame(ID = c('a', 'b', 'c', 'd', 'e'), 
                  var1 = c(1, 2, 3, 4, 5),
                  var2 = c(9, 3, 5, 7, 11))
df1 %>% setNames(paste0(names(.), '_2')) %>% tidyr::crossing(df1) %>% filter(ID != ID_2) -> pairwise

pairwise$overlap <- DescTools::Overlap(c(pairwise$var1,pairwise$var2),c(pairwise$var1_2,pairwise$var2_2)) 

上面创建的测试数据集中每一行的输出(整列)为“10”。我想要每个特定行的重叠,所以前 3 列分别是 2、3、4。

【问题讨论】:

    标签: r overlap desctools


    【解决方案1】:

    我发现最简单的方法是使用rowwise。以前不建议这种操作,但自从dplyr 1.0.0 发布以来,它在性能方面得到了改进。

    pairwise %>%
        rowwise() %>%
        mutate(overlap = Overlap(c(var1, var2), c(var1_2, var2_2))) %>%
        ungroup()
    #> # A tibble: 20 x 7
    #>    ID_2  var1_2 var2_2 ID     var1  var2 overlap
    #>    <chr>  <dbl>  <dbl> <chr> <dbl> <dbl>   <dbl>
    #>  1 a          1      9 b         2     3       1
    #>  2 a          1      9 c         3     5       2
    #>  3 a          1      9 d         4     7       3
    #>  4 a          1      9 e         5    11       4
    #>  5 b          2      3 a         1     9       1
    #>  6 b          2      3 c         3     5       0
    #>  7 b          2      3 d         4     7       0
    #>  8 b          2      3 e         5    11       0
    #>  9 c          3      5 a         1     9       2
    #> 10 c          3      5 b         2     3       0
    #> 11 c          3      5 d         4     7       1
    #> 12 c          3      5 e         5    11       0
    #> 13 d          4      7 a         1     9       3
    #> 14 d          4      7 b         2     3       0
    #> 15 d          4      7 c         3     5       1
    #> 16 d          4      7 e         5    11       2
    #> 17 e          5     11 a         1     9       4
    #> 18 e          5     11 b         2     3       0
    #> 19 e          5     11 c         3     5       0
    #> 20 e          5     11 d         4     7       2
    

    【讨论】:

      【解决方案2】:

      我的带有apply函数的版本

      pairwise$overlap <- apply(pairwise, 1,
                                function(x) DescTools::Overlap(as.numeric(c(x[5], x[6])), 
                                                       as.numeric(c(x[2],x[3])))) 
      pairwise
      # A tibble: 20 x 7
         ID_2  var1_2 var2_2 ID     var1  var2 overlap
         <chr>  <dbl>  <dbl> <chr> <dbl> <dbl>   <dbl>
       1 a          1      9 b         2     3       1
       2 a          1      9 c         3     5       2
       3 a          1      9 d         4     7       3
       4 a          1      9 e         5    11       4
       5 b          2      3 a         1     9       1
       6 b          2      3 c         3     5       0
       7 b          2      3 d         4     7       0
       8 b          2      3 e         5    11       0
       9 c          3      5 a         1     9       2
      10 c          3      5 b         2     3       0
      11 c          3      5 d         4     7       1
      12 c          3      5 e         5    11       0
      13 d          4      7 a         1     9       3
      14 d          4      7 b         2     3       0
      15 d          4      7 c         3     5       1
      16 d          4      7 e         5    11       2
      17 e          5     11 a         1     9       4
      18 e          5     11 b         2     3       0
      19 e          5     11 c         3     5       0
      20 e          5     11 d         4     7       2
      

      【讨论】:

      • YW。考虑投票。
      • 我做到了!但我是新用户,不算数:)
      猜你喜欢
      • 2015-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-07
      • 2017-06-08
      • 1970-01-01
      相关资源
      最近更新 更多