2017-07-03 1 views
2

Wie schreibe ich eine Logik zur Anzeige aller möglichen "N" Ziffern Kombinationen von "A" & "B" wo "A" und "B" ein Paar und "B" kann nur wenn wir eingefügt werden habe bereits ein nicht gepaartes "A".Kombination in R

Für Ex:

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"] 
+1

Was haben Sie versucht? Kannst du auch mehr erklären? Ich verstehe nicht, was Sie mit "bildet ein Paar" (gleiche Anzahl von As und Bs?) Oder was für ein "nicht gepaart A". Warum sind "ABBA", "BAAB", "BABA", "BBAA" nicht im n = 4 Ausgang enthalten? – Gregor

+0

Total verloren mit der Frage .. – Wen

+0

Diese Frage ist ein bisschen unklar, @mak. Meinst du, dass nur eine bestimmte Anzahl von B's hinzugefügt werden kann, um die gleiche Anzahl von A's zu erhalten, die bereits in der Zeichenkette existieren? –

Antwort

3

Ich glaube, das sollten Sie bekommen, was Sie suchen.

# 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 = "")) 
+0

Danke Matt für die Hilfe .. das löst mein Problem ..., ☺ – mak

+1

@mak, wenn das nützlich war, betrachten [als Antwort akzeptieren] (https://meta.stackexchange.com/q/5234/228487). – zx8754