2017-10-10 47 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