2017-07-03 26 views
2

"A" & "B"( "A"と "B"がペアを形成し、 "B"が既にペアになっていない "A"があります。 EXのためにの組み合わせR

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

何を試しましたか?また、もっと説明できますか?私はあなたが "ペアを形成する"(AsとBsの同数)か、 "ペアでないA"とは何を意味するのか理解していません。 "ABBA"、 "BAAB"、 "BABA"、 "BBAA"はn = 4の出力に含まれないのはなぜですか? – Gregor

+0

質問で完全に失われました。 – Wen

+0

この質問は少し不明です、@ mak。文字列にすでに存在するAと同じ数に一致するように、特定の数のBだけを追加できることを意味しますか? –

答えて

3

私は、これはあなたが探している何を得るべきだと考えています。

# 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

Mattさんが助けてくれました。これは私の問題を解決しました...、☺ – mak

+1

@makこれが便利だったなら、[回答として受け入れる](https://meta.stackexchange.com/q/5234/228487)と考えてください。 – zx8754