非等加入两个表

0

的问题

我有2个数据帧在那里,我需要找到有多少次的项模拟$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
)

上述做法是不适合大型数据集,因为循环和我试图用一个非同等参加的方法(通过 data.table). 但是,我坚持如何做一个非同等加入两个表之间(不知道该如何继续进行。)

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

想要寻求某些指导,以这个问题。 感谢您的帮助。

non-equi-join r
2021-11-24 06:40:20
2
2

第一次做的不相等的加入,然后汇总为每 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-24 07:12:05
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

上创建2021-11-24由 reprex包 (v2。0.1)

2021-11-24 07:20:12

其他语言

此页面有其他语言版本

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................