简体   繁体   中英

Amount of overlap of two ranges in R [DescTools?]

I need to know by how many integers two numeric ranges overlap. I tried using DescTools::Overlap, but the output is not what I expected.

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

The output (entire column) is '10' for each row in the test dataset created above. I want the row-specific overlap for each, so the first 3 columns would be 2,3,4, respectively.

I find the easiest way to do it is using rowwise . This operation used to be disadvised, but since dplyr 1.0.0 release, it's been improved in terms of performance.

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

My version with apply function

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM