【问题标题】:Match Value and Interval via overlaps通过重叠匹配值和间隔
【发布时间】:2021-02-18 09:10:36
【问题描述】:

现在我有两个数据框:

amount = c(19,21,39,45,62,71,100,121,130,160,180,210,240)
id = rep(1,length(amount))
test <- data.frame(id,amount)


interval = c(1:10)
bottom = c(0,25,50,75,100,125,150,175,200,225)
top = c(24,49,74,99,124,149,174,199,224,NA)
test_2 <- data.frame(interval,bottom,top)

test包含递增数量的值,test_2包含间隔。我正在尝试加入这两个框架,以便对于test 中的每个金额,我都会得到对应的ìinterval nr。作为一个新列,比如test$intervall。我试过foverlaps已经这样了:

setDT(test)
setDT(test_2)
foverlaps(test_2,test,by.x = amount, by.y = c(bottom,top), type = "within")

但是,这会返回一条错误消息,说

Invalid numeric value for 'by.x'; it should be a vector with values 1 <= by.x <= length(x)

也许你们中的一个可以在这里帮助我,谢谢!

【问题讨论】:

    标签: r join dplyr data.table


    【解决方案1】:

    你可以试试fuzzyjoin

    fuzzyjoin::fuzzy_left_join(test, test_2, 
                               by = c('amount' = 'top', 'amount' = 'bottom'), 
                               match_fun = list(`<=`, `>=`))
    
    #   id amount interval bottom top
    #1   1     19        1      0  24
    #2   1     21        1      0  24
    #3   1     39        2     25  49
    #4   1     45        2     25  49
    #5   1     62        3     50  74
    #6   1     71        3     50  74
    #7   1    100        5    100 124
    #8   1    121        5    100 124
    #9   1    130        6    125 149
    #10  1    160        7    150 174
    #11  1    180        8    175 199
    #12  1    210        9    200 224
    #13  1    240       NA     NA  NA
    

    【讨论】:

      【解决方案2】:

      这行得通吗:

      library(dplyr)
      library(tidyr)
      test_2 %>% mutate(top = replace_na(top, 250)) %>% rowwise() %>% 
      mutate(iv = list(seq(bottom, top, by = 1))) %>% 
      unnest(iv) %>% right_join(test, by = c('iv' = 'amount'), keep = T) %>% 
      select(id, interval, amount)
      # A tibble: 13 x 3
            id interval amount
         <dbl>    <int>  <dbl>
       1     1        1     19
       2     1        1     21
       3     1        2     39
       4     1        2     45
       5     1        3     62
       6     1        3     71
       7     1        5    100
       8     1        5    121
       9     1        6    130
      10     1        7    160
      11     1        8    180
      12     1        9    210
      13     1       10    240
      

      【讨论】:

      • 嘿Karthik,所以我需要的是表格“测试”中的一个新列。所以,最后,表格给了我间隔的 id、数量和数量。
      • @MaxS,对不起,你能解释一下间隔的数量,比如你的意思是行号吗?
      • 是的,当然,所以每个区间都有一个类似 id 的东西,test_2 中的列称为ìntervall。所以这就是我最后需要在表test 中的列,但连接取决于金额是否在顶部和底部值内。
      • @MaxS,对不起,已经做出改变,请看看是否有效。
      • 所以这不适用于我的实际数据,我试图找出原因。你能想到一种使用foverlaps的方法吗?
      猜你喜欢
      • 2018-03-30
      • 2018-03-22
      • 1970-01-01
      • 2019-04-12
      • 2017-06-09
      • 1970-01-01
      • 2021-12-21
      • 2019-09-14
      相关资源
      最近更新 更多