【问题标题】:Non-equi join of two tables两个表的非等连接
【发布时间】:2021-11-24 06:40:20
【问题描述】:

我有 2 个数据框,我需要在其中找到 mock$num 中的条目在范围数据框指定的 x-y 范围内的次数。

id <- c(1:9)
num <- c(99,101,199,250,999,1500,3000,4000,5000)
mock <- data.frame(id, num)

x <- c(100,100,200,1000,4000,4000)
y <- c(198,200,300,2000,5000,5000)
range <- data.frame(x,y)

所需的输出如下所示

id num check
1 99   0
2 101  2
3 199  1
4 250  1
5 999  0
6 1500 1
7 3000 0
8 4000 2
9 5000 2

可以通过以下代码获取

mock$check <- mapply(
    function(x){
        count = 0
        for (i in 1:nrow(range)){
            if (x >= range$x[i] & x <= range$y[i]){
                count = count + 1
            }
        }
        paste0(count)
    },
    mock$num
)

由于 for 循环,上述方法不适合大型数据集,我尝试使用非 equi 连接方法(通过 data.table)。但是,我不知道如何在两个表之间进行非等连接(不知道如何继续...)

nonequi <- mock[range, on =.(num >= x, num <=y),]

想就这个问题寻求一些指导。感谢您的帮助。

【问题讨论】:

    标签: r non-equi-join


    【解决方案1】:

    首先进行非 equi 连接,然后为每个 id 总结它出现的次数并返回到 mock 以找出哪些 id 被遗漏了。对于那些 id,将 count 设置为零。

    res <- setDT(mock)[setDT(range), .(id), on = .(num >= x, num <= y)][, .N, by = id][mock, on = .(id)][is.na(N), N := 0][]
    

    【讨论】:

      【解决方案2】:

      不确定大型数据数组的执行速度

      id <- c(1:9)
      num <- c(99,101,199,250,999,1500,3000,4000,5000)
      mock <- data.frame(id, num)
      
      x <- c(100,100,200,1000,4000,4000)
      y <- c(198,200,300,2000,5000,5000)
      RANGE <- data.frame(x,y)
      
      mock$check <- sapply(mock$num, function(z) sum(z >= RANGE$x & z <= RANGE$y))
      
      mock
      #>   id  num check
      #> 1  1   99     0
      #> 2  2  101     2
      #> 3  3  199     1
      #> 4  4  250     1
      #> 5  5  999     0
      #> 6  6 1500     1
      #> 7  7 3000     0
      #> 8  8 4000     2
      #> 9  9 5000     2
      

      reprex package (v2.0.1) 于 2021 年 11 月 24 日创建

      【讨论】:

        猜你喜欢
        • 2023-04-09
        • 2018-06-09
        • 1970-01-01
        • 2020-07-02
        • 2011-07-21
        • 2014-09-30
        • 1970-01-01
        • 2018-03-10
        • 2016-12-09
        相关资源
        最近更新 更多