मोनोटोनिक (बढ़ते या घटते) क्रमपरिवर्तन [डुप्लिकेट] बनाने का कार्य

Nov 26 2020

मैं एक बड़े वेक्टर के सभी नीरस रूप से बढ़ते क्रमों को उत्पन्न करने के लिए एक कुशल फ़ंक्शन बनाने की कोशिश कर रहा हूं। जाहिर है, आउटपुट को कम करता है 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

बेस आर या, इस क्षमता के साथ मौजूदा पैकेज का उपयोग कर कोई सुझाव?

संपादित करें: एक आदर्श समाधान तो क्रमपरिवर्तन करने के लिए क्रमपरिवर्तन का पूरा सेट उत्पन्न करने से बचना होगा।

जवाब

3 AbdessabourMtk Nov 26 2020 at 04:56

इसका उपयोग करना 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)
2 stevec Nov 26 2020 at 05:03

यहां कुछ कोड दिए गए हैं जो आपके उदाहरण के अनुसार दोहराए गए के साथ क्रमपरिवर्तन बनाता है, और यह पता लगाता है कि प्रत्येक क्रमपरिवर्तन मोनोटोनिक है या नहीं

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
# ....