【问题标题】:finding the overleap values in R在 R 中找到重叠值
【发布时间】:2020-12-22 22:53:56
【问题描述】:
d1<-data.frame(ID=c(1:6),
               Locx1=c(100,121,146,194,162,182),
               Locx2=c(148,170,184,236,196,190),
               Locy1=c(119,173,104,164,188,142),
               Locy2=c(168,180,120,210,190,213))

在上面的数据中,Locx1是x的起点,Locx2是x的终点,Locy1是y的起点,Locy2是y的终点。我想在 R 中找到 Locy1Locy2 的 50%(及更多)介于 Locx1Locx2 之间的 y 值。我该怎么做?

例如,第一行适合这个例子。 y的起点是Locx1Locx2之间的(119),并且(148-119)/(168-119)大于%50。

谢谢

【问题讨论】:

    标签: r data-manipulation


    【解决方案1】:

    如果我猜对了

    df %>% 
      filter((pmin(Locy2, Locx2) - pmax(Locy1, Locx1)) / (Locx2 - Locx1) >= 0.5)
    
      ID Locx1 Locx2 Locy1 Locy2
    1  1   100   148   119   168
    2  6   182   190   142   213
    

    【讨论】:

    • 您可能会发现其他答案很有帮助。所以我误解了这个问题。你能用你的例子展示你想要的结果吗?
    【解决方案2】:

    intersectxy 中的lengths 除以y 的完整长度。

    ## helper FUNs
    intl <- function(i) length(i[[1]]:i[[2]])  ## interval length
    seq1 <- function(i) i[[1]]:i[[2]]  ## seq from `:`
    
    res <- lengths(Map(intersect, apply(y, 1, seq1), apply(x, 1, seq1))) / apply(y, 1, intl)
    # [1] 0.6000000 0.0000000 0.0000000 0.3617021 1.0000000 0.1250000
    res > .5
    # [1]  TRUE FALSE FALSE FALSE  TRUE FALSE
    

    数据:

    d1 <- structure(list(ID = 1:6, Locx1 = c(100, 121, 146, 194, 162, 182
    ), Locy1 = c(119, 173, 104, 164, 188, 142), Locx2 = c(148, 170, 
    184, 236, 196, 190), Locy2 = c(168, 180, 120, 210, 190, 213)), class = "data.frame", row.names = c(NA, 
    -6L))
    

    【讨论】:

      【解决方案3】:

      一个有点冗长但希望也更透明的解决方案,它产生与@jay.sf 相同的结果

      library(dplyr)
      #> 
      #> Attaching package: 'dplyr'
      #> The following objects are masked from 'package:stats':
      #> 
      #>     filter, lag
      #> The following objects are masked from 'package:base':
      #> 
      #>     intersect, setdiff, setequal, union
      
      d1<-data.frame(ID=c(1:6),
                     Locx1=c(100,121,146,194,162,182),
                     Locx2=c(148,170,184,236,196,190),
                     Locy1=c(119,173,104,164,188,142),
                     Locy2=c(168,180,120,210,190,213))
      
      d2 <- d1 %>% mutate(seqx = purrr::map2(Locx1, Locx2, .f = ~seq(.x, .y, 1)),
                          seqy = purrr::map2(Locy1, Locy2, .f = ~seq(.x, .y, 1)),
                          intersection = purrr::map2(seqx, seqy, .f = ~intersect(.x, .y)),
                          overlap = purrr::map2_dbl(intersection, seqy, .f = ~length(.x)/length(.y)),
                          my_condition = overlap >= 0.5
                          ) 
      d2 %>% select(-contains('seq'), -intersection)
      #>   ID Locx1 Locx2 Locy1 Locy2   overlap my_condition
      #> 1  1   100   148   119   168 0.6000000         TRUE
      #> 2  2   121   170   173   180 0.0000000        FALSE
      #> 3  3   146   184   104   120 0.0000000        FALSE
      #> 4  4   194   236   164   210 0.3617021        FALSE
      #> 5  5   162   196   188   190 1.0000000         TRUE
      #> 6  6   182   190   142   213 0.1250000        FALSE
      

      由 reprex 包 (v0.3.0) 于 2020-09-03 创建

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-10-04
        • 2012-12-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-08-26
        • 1970-01-01
        • 2013-05-30
        相关资源
        最近更新 更多