2 votes

Combinaison en R

Comment écrire une logique pour afficher toutes les combinaisons possibles de "N" chiffres de "A" et "B" où "A" et "B" forment une paire et "B" ne peut être inséré que si nous avons déjà un "A" non apparié.

Par exemple :

when N=2, output should be ["AB"]   
when N=4, output should be ["AABB","ABAB"]  
when N=6, output should be ["AAABBB","AABBAB","AABABB","ABABAB","ABAABB"]

3voto

Matt Jewett Points 2187

Je pense que cela devrait vous permettre d'obtenir ce que vous recherchez.

# Number of combinations
n <- 6

# Create dataframe of all combinations for 1 and -1 taken n number of times
# For calculations 1 = A and -1 = B
df <- expand.grid(rep(list(c(1,-1)), n))

# Select only rows that have 1 as first value
df <- df[df[,1] == 1,]

# Set first value for all rows as "A"
df[,1] <- "A"

# Set value for first calculation column as 1
df$s <- 1

# Loop through all columns starting with 2
for(i in 2:n){
  # Get name of current column
  cur.col <- colnames(df)[i]

  # Get the difference between the number of 1 and -1 for current column and the running total
  df$s2 <- apply(df[,c(cur.col,"s")], 1, sum)

  # Remove any rows with a negative value
  df <- df[df$s2 >= 0,]

  # Set running total to current total
  df$s <- df$s2

  # Set values for current column
  df[,i] <- sapply(as.character(df[,i]), switch, "1" = "A", "-1" = "B")

  # Check if current column is last column
  if(i == n){
    # Only select rows that have a total of zero, indicating that row has a pairs of AB values
    df <- df[df$s2 == 0, 1:n]
  }
}

# Get vector of combinations
combos <- unname(apply(df[,1:n], 1, paste0, collapse = ""))

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X