2016-09-25 86 views
3

我正在爲特定輸入進行所有可能的組合,但必須根據輸入的順序進行排序。由於組合不同大小,即時通訊與以前發佈的答案掙扎..R中的具體訂購

我想知道這是可能的..

輸入:

D N A 3 

這意味着我需要輸出它在所有組合多達3個字符串:

D 
DD 
DDD 
DDN 
DDA 
DND 
DNA 
. 
. 

這基本上是按升序排列,如果我們考慮D<N<A

到目前爲止,我的輸出是這樣的:

A 
AA 
AAA 
AAD 
AAN 
AD 
ADA 
ADD 
ADN 
AN 
. 
. 

我試圖轉換輸入的因子C(「d」,「N」,「A」)和排序我的輸出,但隨後消失任何大於1個字符的字符串。

任何見解?

+0

什麼是對訂貨的原因是什麼? –

+0

我不明白免打擾,不應該是DDN嗎?您可以對整數進行排序,並將字符分爲'chartr'('123','DNA',c('1','11','123','122','133'))' – rawr

+0

@rawr這是升序排列,DDN來自DDD –

回答

3

這裏是一個可能的解決方案:

generateCombs <- function(x, n){ 
    if (n == 1) return(x[1]) # Base case 
    # Create a grid with all possible permutations of 0:n. 0 == "", and 1:n correspond to elements of x 
    permutations = expand.grid(replicate(n, 0:n, simplify = F)) 
    # Order permutations 
    orderedPermutations = permutations[do.call(order, as.list(permutations)),] 
    # Map permutations now such that 0 == "", and 1:n correspond to elements of x 
    mappedPermutations = sapply(orderedPermutations, function(y) c("", x)[y + 1]) 
    # Collapse each row into a single string 
    collapsedPermutations = apply(mappedPermutations, 1, function(x) paste0(x, collapse = "")) 
    # Due to the 0's, there will be duplicates. We remove the duplicates in reverse order 
    collapsedPermutations = rev(unique(rev(collapsedPermutations)))[-1] # -1 removes blank 
    # Return as data frame 
    return (as.data.frame(collapsedPermutations)) 
} 

x = c("D", "N", "A") 
n = 3 
generateCombs(x, n) 

輸出是:

collapsedPermutations 
1      D 
2      DD 
3     DDD 
4     DDN 
5     DDA 
6      DN 
7     DND 
8     DNN 
9     DNA 
10     DA 
11     DAD 
... 
1

我剛剛發現一個使用隨機庫的解決方案(所以我可能會使用它錯誤),稱爲iterpc

生成所有組合,對元素進行因素分類,然後將其轉換爲字符串。

ordered_combn = function(elems) { 
    require(data.table) 
    require(iterpc) 

    I = lapply(seq_along(elems), function(i) iterpc::iterpc(table(elems), i, replace=TRUE, ordered=TRUE)) 
    I = lapply(I, iterpc::getall) 
    I = lapply(I, as.data.table) 

    dt = rbindlist(I, fill = TRUE) 
    dt[is.na(dt)] = "" 

    cols = paste0("V", 1:length(elems)) 
    dt[, (cols) := lapply(.SD, factor, levels = c("", elems)), .SDcols = cols] 

    setkey(dt) 
    dt[, ID := 1:.N] 
    dt[, (cols) := lapply(.SD, as.character), .SDcols = cols] 
    dt[, ord := paste0(.SD, collapse = ""), ID, .SDcols = cols] 

    # return dt[, ord] as an ordered factor for neatness 
    dt 
} 

elems = c("D", "N", "A") 
combs = ordered_combn(elems) 
combs 

輸出

V1 V2 V3 ID ord 
1: D  1 D 
2: D D  2 DD 
3: D D D 3 DDD 
4: D D N 4 DDN 
5: D D A 5 DDA 
6: D N  6 DN 
7: D N D 7 DND 
8: D N N 8 DNN 
...