मान लीजिए कि मैं वेक्टर x को फ़िल्टर करना चाहता हूं, जिसके आधार पर वेक्टर y में कौन से मान लगभग दिखाई देते हैं:

x <- c(1.123456789, 2.123456789, 3.123456789)
y <- c(1.12345, 2.12345)

अगर मैं अनुमानित तुलना नहीं चाहता, तो मैं %in% का उपयोग करूंगा:

x %in% y
[1] FALSE FALSE FALSE

जहां मेरा आवश्यक परिणाम है:

# something like: x %near_in% y
[1] TRUE TRUE FALSE

dplyr::near(x, y, tol) फ़ंक्शन की सहायता फ़ाइल में "x, y: तुलना करने के लिए संख्यात्मक वैक्टर" का उल्लेख है, लेकिन यह निश्चित रूप से पूरी तरह से सच नहीं है, y या तो x की लंबाई या एक होना चाहिए एकल मान, क्योंकि सभी near() abs() फ़ंक्शन का उपयोग करते हैं:

near <- function (x, y, tol = .Machine$double.eps^0.5) 
{
    abs(x - y) < tol
}

और अगर हम ऐसा करते हैं तो हम देखते हैं कि abs() y के मान लेता है और उन्हें तब तक दोहराता है जब तक इसकी आवश्यकता नहीं होती (बिना किसी चेतावनी के), और हमें मिलता है:

abs(x - y)
[1] 0.000006789 0.000006789 2.000006789
Warning message:
In x - y : longer object length is not a multiple of shorter object length

मेरा वर्तमान समाधान y के तत्वों पर n x m मैट्रिक्स (यहां 3 x 2) बनाने के लिए sapply() का उपयोग करना है, फिर apply() का उपयोग करके देखें कि क्या any() पंक्तियों में (x के मान) में TRUE है:

apply(sapply(y, function(y_val) near(x, y_val, 0.0001)), 1, any)
[1] TRUE TRUE FALSE

लेकिन यह बोझिल लगता है! क्या होगा यदि मेरे पास y में हज़ारों मान हों, तो क्या मैं हज़ारों पंक्तियों के साथ एक अस्थायी मैट्रिक्स नहीं बना रहा हूँ? कोई बेहतर तरीका?

1
Giora Simchoni 5 सितंबर 2021, 09:08

2 जवाब

सबसे बढ़िया उत्तर

आप floor या round मान कर सकते हैं:

tol <- 1e-5
floor(x/tol)
#> [1] 112345 212345 312345
floor(y/tol)
#> [1] 112345 212345
floor(x/tol) %in% floor(y/tol)
#> [1]  TRUE  TRUE FALSE
2
Waldi 5 सितंबर 2021, 06:28

मुझे पूरा विश्वास नहीं है। लेकिन DescTools लाइब्रेरी पर एक नज़र डालें जहां आप निकटतम मान पा सकते हैं:

library(DescTools)

y %in% sapply(x, function(i) Closest(y, i))

[1] TRUE TRUE
0
TarJae 5 सितंबर 2021, 06:34