के सभी तत्वों के बीच समानता के लिए परीक्षण मैं परीक्षण करने की कोशिश कर रहा हूं कि वेक्टर के सभी तत्व एक-दूसरे के बराबर हैं या नहीं। जिन समाधानों के साथ मैं आया हूं, वे कुछ हद तक चौराहे लगते हैं, जिनमें length()
की जांच शामिल है।एक वेक्टर
x <- c(1, 2, 3, 4, 5, 6, 1) # FALSE
y <- rep(2, times = 7) # TRUE
unique()
के साथ:
length(unique(x)) == 1
length(unique(y)) == 1
rle()
के साथ:
length(rle(x)$values) == 1
length(rle(y)$values) == 1
एक समाधान है कि मुझे तत्वों के बीच 'समानता' का आकलन करने के लिए एक सहिष्णुता मूल्य शामिल FAQ 7.31 से बचने के लिए आदर्श होगा दिया जाएगा मुद्दे।
क्या परीक्षण के प्रकार के लिए एक अंतर्निहित फ़ंक्शन है जिसे मैंने पूरी तरह अनदेखा कर दिया है? identical()
और all.equal()
दो आर वस्तुओं की तुलना करें, इसलिए वे यहां काम नहीं करेंगे।
संपादित करें 1
यहाँ कुछ बेंच मार्किंग परिणाम हैं। परिणाम के साथ
library(rbenchmark)
John <- function() all(abs(x - mean(x)) < .Machine$double.eps^0.5)
DWin <- function() {diff(range(x)) < .Machine$double.eps^0.5}
zero_range <- function() {
if (length(x) == 1) return(TRUE)
x <- range(x)/mean(x)
isTRUE(all.equal(x[1], x[2], tolerance = .Machine$double.eps^0.5))
}
x <- runif(500000);
benchmark(John(), DWin(), zero_range(),
columns=c("test", "replications", "elapsed", "relative"),
order="relative", replications = 10000)
: कोड का उपयोग करना
test replications elapsed relative
2 DWin() 10000 109.415 1.000000
3 zero_range() 10000 126.912 1.159914
1 John() 10000 208.463 1.905251
तो यह लग रहा है diff(range(x)) < .Machine$double.eps^0.5
की तरह सबसे तेज है।
R> compare <- function(v) all(sapply(as.list(v[-1]),
+ FUN=function(z) {identical(z, v[1])}))
R> compare(x)
[1] FALSE
R> compare(y)
[1] TRUE
R>
इस तरह आप के रूप में की जरूरत के लिए किसी भी identical()
एप्सिलॉन जोड़ सकते हैं:
मैंने इसे डिर्क की तुलना में तेज़ होने के लिए चुना है। मेरे पास लाखों तत्व नहीं हैं, लेकिन यह मेरे लिए थोड़ा तेज चलना चाहिए। – kmm
@ केविन: जॉन के समाधान के बारे में क्या? यह हैडली की तुलना में ~ 10x तेज है और आपको सहनशीलता सेट करने की अनुमति देता है। क्या यह किसी अन्य तरीके से कमी है? –
कृपया कुछ बेंचमार्किंग प्रदान करें - मैंने अभी जांच की है कि मेरा एक लाख वर्दी के वेक्टर के लिए समान है। – hadley