在R中的数据框中查找所有组合的有效方法

时间:2018-08-06 10:08:44

标签: r dataframe combinations

我正在寻找R中的一种有效方法来推导可能的组合。 我有一个包含3列的数据框,根据第一列的内容,我正在计算所有可能的组合。

df <- data.frame("H" = c("H1","H2","H3","H4"), "W1" = c(95, 0, 85 ,0) , "W2" = c(50, 85, 0,0))
df$H <- as.character.factor(df$H)

nH <- nrow(df)
nW <- 2

library(plyr)
library(gtools)

if(nW<=5){

# Find all possible combinations
mat1 <- matrix(nrow = 0, ncol = nH)

for(i in 1:nH){
# mat1 <- rbind.fill.matrix(mat1, combinations(nH,nH-(i-1),df$H))

mat1 <- rbind.fill.matrix(mat1, t(combn(df$H,nH-(i-1))))

}
df_comb <- data.frame(mat1)

}
View(df_comb)

df_comb 给出正确的输出。上面的代码适用于小型数据集,但是当H列的值大于15时,R会导致内存不足。

寻找在R到H1,H2 .... H49,H50之前在R中有效地计算组合的方法。

编辑:

尝试了另一种方法,现在,在经过一定数量的可能组合(在以下情况下为32767)之后,应用随机抽样以比率法生成组合。

nH <- 26
nW <- 2

if(nW<=5){

# Find all possible combinations ~~~~~ Random Sampling
ncomb <- 0
for(i in 1:nH){
ncomb <- ncomb + choose(nH, nH-(i-1))
}
nmax <- 10000 # Total number of combinations cannot exceed 10000
mat1 <- matrix( nrow = 0, ncol = nH)

for(i in 1:nH){  # For each Group 26C1 26C2 26C3 ..... 26C25 26C26
ncombi <- choose(nH, nH-(i-1)) #For i = 1 , 26C25
ncombComputed <- ceiling(nmax/ncomb*choose(nH, nH-(i-1))) 

if(ncomb <=  32767 ){ # This condition is independent of NMAX - For 15   
#Combinations
  print("sefirst")
  final <- mat1
  print(paste(nH," ",i))
  abc <- combinations(nH,nH-(i-1),df$herbicide)
  mat1 <- rbind.fill.matrix(mat1, combinations(nH,nH-(i-1),df$H))
} 

else {
  print(i)
  print("second")
  combi <- matrix( nrow = 0, ncol = nH-(i-1))

  #random sampling

  while(nrow(combi) < ncombComputed){

    combi<- rbind(combi,sort(sample(df$herbicide,nH-(i-1))))

    combi <- unique(combi)
  }
  mat1 <- rbind.fill.matrix(mat1, combi)
}
}

df_comb_New <- data.frame(mat1)

}

上面的代码给出了结果,但是对于10000个组合来说,对于26个条目来说需要36秒。现在我正在寻找一种优化while循环的方法,以便执行变得更快或其他有效地获得相同结果的方法。

0 个答案:

没有答案