2

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

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

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

4

2 回答 2

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 包于 2021-11-24 创建(v2.0.1)

于 2021-11-24T07:20:12.083 回答
2

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

res <- setDT(mock)[setDT(range), .(id), on = .(num >= x, num <= y)][, .N, by = id][mock, on = .(id)][is.na(N), N := 0][]
于 2021-11-24T07:12:05.473 回答