मोनोटोनिक (बढ़ते या घटते) क्रमपरिवर्तन [डुप्लिकेट] बनाने का कार्य
मैं एक बड़े वेक्टर के सभी नीरस रूप से बढ़ते क्रमों को उत्पन्न करने के लिए एक कुशल फ़ंक्शन बनाने की कोशिश कर रहा हूं। जाहिर है, आउटपुट को कम करता है expand.grid
या gtools::permutations
काम करता है, लेकिन केवल छोटे वैक्टर के लिए।
उदाहरण:
x = 1:3
वांछित उत्पादन:
1, 1, 1
1, 1, 2
1, 1, 3
1, 2, 2
1, 2, 3
1, 3, 3
2, 2, 2
2, 2, 3
2, 3, 3
3, 3, 3
बेस आर या, इस क्षमता के साथ मौजूदा पैकेज का उपयोग कर कोई सुझाव?
संपादित करें: एक आदर्श समाधान तो क्रमपरिवर्तन करने के लिए क्रमपरिवर्तन का पूरा सेट उत्पन्न करने से बचना होगा।
जवाब
इसका उपयोग करना data.table
काफी आसान है:
expand.monotonic <- function(x, len=length(x)){
do.call(CJ, lapply(integer(len), function(...) x ))[
eval(parse(text=paste0("V", 2:len, ">=", "V", 1:(len-1), collapse="&") )), ]
}
expand.monotonic(1:3)
V1 V2 V3
1: 1 1 1
2: 1 1 2
3: 1 1 3
4: 1 2 2
5: 1 2 3
6: 1 3 3
7: 2 2 2
8: 2 2 3
9: 2 3 3
10: 3 3 3
स्पष्टीकरण:
पहले एक सूची बनाएं जिसमें प्रतिकृति वेक्टर len
समय हो, data.table::CJ
सभी वैक्टर में शामिल होने के लिए क्रॉस का उपयोग करें । और यह वह जगह है जहां जादू len
एक अभिव्यक्ति के आधार पर होता है मूल V2>=V1&V3>=V2
रूप V#
से अनाम स्तंभों के लिए डिफ़ॉल्ट नाम है, और कहा अभिव्यक्ति का मूल्यांकन करके उपसमुच्चय।
parse(text=paste0("V", 2:len, ">=", "V", 1:(len-1), collapse="&") )
# expression(V2>=V1&V3>=V2)
यहां कुछ कोड दिए गए हैं जो आपके उदाहरण के अनुसार दोहराए गए के साथ क्रमपरिवर्तन बनाता है, और यह पता लगाता है कि प्रत्येक क्रमपरिवर्तन मोनोटोनिक है या नहीं
x <- 1:3
# Generate permutations of length x
out <- gtools::permutations(length(x), length(x), v = x, repeats.allowed=TRUE)
# Detect if they're monotonic
mono <- apply(out, 1, function(x) { all(x == cummax(x)) })
output_with_monotonic_label <- cbind(out, mono)
# output_with_monotonic_label
# mono
# [1,] 1 1 1 1
# [2,] 1 1 2 1
# [3,] 1 1 3 1
# [4,] 1 2 1 0
# [5,] 1 2 2 1
# [6,] 1 2 3 1
# [7,] 1 3 1 0
# [8,] 1 3 2 0
# [9,] 1 3 3 1
# [10,] 2 1 1 0
# ....