İki tablonun eşit olmayan birleşimi

0

Soru

Mock$num girdilerinin aralık veri çerçevesi tarafından belirtilen xy aralığına kaç kez girdiğini bulmam gereken 2 veri çerçevem var.

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)

İstenen çıktı aşağıda gösterilmiştir

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

aşağıdaki kodla elde edilebilir

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
)

Yukarıdaki yaklaşım, for döngüsü nedeniyle büyük veri kümeleri için uygun değildir ve eşit olmayan bir birleştirme yöntemi kullanmaya çalışıyordum (via data.table). Ancak, iki tablo arasında eşit olmayan bir birleşimin nasıl yapılacağı konusunda sıkışıp kaldım (nasıl devam edeceğimden emin değilim...)

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

Bu soruna biraz rehberlik etmek istiyorum. Yardımlarınız için teşekkürler.

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

Her biri için ilk non-equi sonra katılmak özetler id kaç kez görünür ve tekrar katılır mock hangi kimliklerin dışarıda bırakıldığını bulmak için. Bu kimlikler için sayımı sıfıra ayarlayın.

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

büyük veri dizileri için yürütme hızından emin değilim

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 paketi (v2.0.1)tarafından 2021-11-24 tarihinde oluşturuldu

2021-11-24 07:20:12

Diğer dillerde

Bu sayfa diğer dillerde

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