2017-10-10 48 views
0

我想準備一個動態置換爲數據集設置,使得它看起來這個多種組合和排列中的R

ID  Val Perm 1 Perm 2 Perm3 Perm 4 Perm 5 Perm 6 Perm 7 Perm 8 Perm 9 Perm 10 Perm 11 Perm 12 Perm 13 Perm 14 Perm 15 Perm 16 Perm 17 Perm 18 Perm 19 Perm 20 Perm 21 Perm 22 Perm 23 Perm 24 Perm 25 Perm 26 Perm 27 Perm 28 Perm 29 Perm 30 Perm 31 Perm 32 Perm 33 Perm 34 Perm 35 Perm 36 
12,000  1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 
12,581  2 Range 2 Range 2 Range 2 Range 2 Range 2 Range 2 Range 2 Range 2 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 
12,857  2 Range 3 Range 2 Range 2 Range 2 Range 2 Range 2 Range 2 Range 2 Range 2 Range 2 Range 2 Range 2 Range 2 Range 2 Range 2 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 
13,387  5 Range 3 Range 3 Range 2 Range 2 Range 2 Range 2 Range 2 Range 2 Range 3 Range 2 Range 2 Range 2 Range 2 Range 2 Range 2 Range 2 Range 2 Range 2 Range 2 Range 2 Range 2 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 
15,846  2 Range 3 Range 3 Range 3 Range 2 Range 2 Range 2 Range 2 Range 2 Range 3 Range 3 Range 2 Range 2 Range 2 Range 2 Range 2 Range 3 Range 2 Range 2 Range 2 Range 2 Range 2 Range 2 Range 2 Range 2 Range 2 Range 2 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 
23,387  5 Range 3 Range 3 Range 3 Range 3 Range 2 Range 2 Range 2 Range 2 Range 3 Range 3 Range 3 Range 2 Range 2 Range 2 Range 2 Range 3 Range 3 Range 2 Range 2 Range 2 Range 2 Range 3 Range 2 Range 2 Range 2 Range 2 Range 2 Range 2 Range 2 Range 2 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 
25,424  4 Range 3 Range 3 Range 3 Range 3 Range 3 Range 2 Range 2 Range 2 Range 3 Range 3 Range 3 Range 3 Range 2 Range 2 Range 2 Range 3 Range 3 Range 3 Range 2 Range 2 Range 2 Range 3 Range 3 Range 2 Range 2 Range 2 Range 3 Range 2 Range 2 Range 2 Range 2 Range 2 Range 2 Range 1 Range 1 Range 1 
25,424  2 Range 3 Range 3 Range 3 Range 3 Range 3 Range 3 Range 2 Range 2 Range 3 Range 3 Range 3 Range 3 Range 3 Range 2 Range 2 Range 3 Range 3 Range 3 Range 3 Range 2 Range 2 Range 3 Range 3 Range 3 Range 2 Range 2 Range 3 Range 3 Range 2 Range 2 Range 3 Range 2 Range 2 Range 2 Range 2 Range 1 
25,932  6 Range 3 Range 3 Range 3 Range 3 Range 3 Range 3 Range 3 Range 2 Range 3 Range 3 Range 3 Range 3 Range 3 Range 3 Range 2 Range 3 Range 3 Range 3 Range 3 Range 3 Range 2 Range 3 Range 3 Range 3 Range 3 Range 2 Range 3 Range 3 Range 3 Range 2 Range 3 Range 3 Range 2 Range 3 Range 2 Range 2 
25,932  1 Range 3 Range 3 Range 3 Range 3 Range 3 Range 3 Range 3 Range 3 Range 3 Range 3 Range 3 Range 3 Range 3 Range 3 Range 3 Range 3 Range 3 Range 3 Range 3 Range 3 Range 3 Range 3 Range 3 Range 3 Range 3 Range 3 Range 3 Range 3 Range 3 Range 3 Range 3 Range 3 Range 3 Range 3 Range 3 Range 3 

從數據集

dput(df) 
structure(list(ID = c(12000, 12581, 12857, 13387, 15846, 23387, 
25424, 25424, 25932, 25932), Val = c(1L, 2L, 2L, 5L, 2L, 5L, 
4L, 2L, 6L, 1L)), .Names = c("ID", "Val"), class = c("tbl_df", 
"tbl", "data.frame"), row.names = c(NA, -10L), spec = structure(list(
    cols = structure(list(ID = structure(list(), class = c("collector_number", 
    "collector")), Val = structure(list(), class = c("collector_integer", 
    "collector"))), .Names = c("ID", "Val")), default = structure(list(), class = c("collector_guess", 
    "collector"))), .Names = c("cols", "default"), class = "col_spec")) 

在這裏,我嘗試創建每個列通過保持「範圍1」不變並遞增「範圍2」並相應地減少「範圍3」。另外我試着它只有10行,但在未來的行數可以增加。 雖然我曾與

apply(combinations(n=3,r=5,v = c("Range 1","Range 2","Range 3"),repeats.allowed = T),2,sort) 

v <- c("Range 1","Range 2","Range 3");expand.grid(rep(list(v), 5)) 

但沒有成功,但嘗試。有沒有其他方法可以這樣做。任何想法將提前

DOMNICK

+0

【如何使一個偉大的[R重複的例子?(http://stackoverflow.com/questions/5963269) – Sotos

+0

試圖使可再生的dataframe.kindly檢查更新 – Domnick

+0

什麼'$ DF瓦爾'代表,以及它如何與排列相對應?什麼是從值生成列的邏輯? – Gonzo

回答

1

對於較短的解釋和更普遍的緣故appreciate.Thanks(如你所提到的行數可以擦菜板是10),我提議以下,你可以實現邏輯你自己: 開始時,初始設置。

n <- 10 
k <- 3 
df <- as.data.frame(lapply(1:n, function(x) x <- k:1)) 

下面的代碼創建10個元素集合的所有唯一組合,其順序無關緊要。

all <- as.matrix(expand.grid(df)) 
all_sorted <- t(apply(all, 1, sort)) 
all_sorted_unique <- unique(all_sorted) 

在10元,則所有的獨特元素必須出現

exclude_if_not_all <- 
    which( 
    apply(all_sorted_unique, 1, 
     function(x) length(unique(x))!=3) 
) 

t(all_sorted_unique[-exclude_if_not_all,]) 

結果符合市場預期。

 [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13] [,14] [,15] [,16] [,17] [,18] [,19] [,20] [,21] [,22] [,23] [,24] [,25] [,26] [,27] [,28] [,29] [,30] [,31] [,32] [,33] [,34] [,35] [,36] 
[1,] 1 1 1 1 1 1 1 1 1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1 
[2,] 2 2 1 2 1 1 2 1 1  1  2  1  1  1  1  2  1  1  1  1  1  2  1  1  1  1  1  1  2  1  1  1  1  1  1  1 
[3,] 3 2 2 2 2 1 2 2 1  1  2  2  1  1  1  2  2  1  1  1  1  2  2  1  1  1  1  1  2  2  1  1  1  1  1  1 
[4,] 3 3 3 2 2 2 2 2 2  1  2  2  2  1  1  2  2  2  1  1  1  2  2  2  1  1  1  1  2  2  2  1  1  1  1  1 
[5,] 3 3 3 3 3 3 2 2 2  2  2  2  2  2  1  2  2  2  2  1  1  2  2  2  2  1  1  1  2  2  2  2  1  1  1  1 
[6,] 3 3 3 3 3 3 3 3 3  3  2  2  2  2  2  2  2  2  2  2  1  2  2  2  2  2  1  1  2  2  2  2  2  1  1  1 
[7,] 3 3 3 3 3 3 3 3 3  3  3  3  3  3  3  2  2  2  2  2  2  2  2  2  2  2  2  1  2  2  2  2  2  2  1  1 
[8,] 3 3 3 3 3 3 3 3 3  3  3  3  3  3  3  3  3  3  3  3  3  2  2  2  2  2  2  2  2  2  2  2  2  2  2  1 
[9,] 3 3 3 3 3 3 3 3 3  3  3  3  3  3  3  3  3  3  3  3  3  3  3  3  3  3  3  3  2  2  2  2  2  2  2  2 
[10,] 3 3 3 3 3 3 3 3 3  3  3  3  3  3  3  3  3  3  3  3  3  3  3  3  3  3  3  3  3  3  3  3  3  3  3  3 

你現在需要做的是隻將這個矩陣綁定到你的初始數據上。 所有功能

customPermutation <- function(n, k){ 

    df <- as.data.frame(lapply(1:n, function(x) x <- 1:k)) 

    all <- as.matrix(expand.grid(df)) 
    all_sorted <- t(apply(all, 1, sort)) 
    all_sorted_unique <- unique(all_sorted) 

    exclude_if_not_all <- which(apply(all_sorted_unique, 1, function(x) length(unique(x))!=3)) 
    t(all_sorted_unique[-exclude_if_not_all,]) 

} 
+0

它按照我想要的方式工作。非常感謝,非常感謝。 – Domnick