2

我需要知道两个数字范围重叠了多少整数。我尝试使用 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。

4

2 回答 2

3

我发现最简单的方法是使用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
于 2021-03-25T17:34:09.317 回答
1

我的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
于 2021-03-25T17:43:31.550 回答