-1

how to make a combination of letters

label=c("A","B","C","D","E")

into a dataframe with 4 group (G1, G2, G3, G4) as follows

k2=data.frame(G1=c("AB","AC","AD","AE","BC","BD","BE","CD","CE","DE"),
    G2=c("C","B","B","B","A","A","A","A","A","A"),
    G3=c("D","D","C","C","D","C","C","B","B","B"),
    G4=c("E","E","E","D","E","E","D","E","D","C"))

and if i want to make group into 3 (G1, G2, G3) and give condition so that "B" and "C" can't separate like below dataframe how to do?

k3=data.frame(G1=c("BCD","BCE","BCA","AE","AD","DE"),
    G2=c("A","A","D","BC","BC","BC"),
    G3=c("E","D","E","D","E","A"))

Thank you very much for the help

Michele
  • 29
  • 1

1 Answers1

0

Here is one way to do what you want to do:

a <- t(combn(c("A", "B", "C", "D", "E"), 2))
a <- paste0(a[, 1], a[, 2])
b <- t(apply(a, 1, function(x) setdiff(c("A", "B", "C", "D", "E"), x)))
k2 <- data.frame(a, b)
colnames(k2) <- paste0("G", 1:4)
k2
#    G1 G2 G3 G4
# 1  AB  C  D  E
# 2  AC  B  D  E
# 3  AD  B  C  E
# 4  AE  B  C  D
# 5  BC  A  D  E
# 6  BD  A  C  E
# 7  BE  A  C  D
# 8  CD  A  B  E
# 9  CE  A  B  D
# 10 DE  A  B  C

The simplest way to do the second version is to exclude "C" and add it at the end:

d <- t(combn(c("A", "B", "D", "E"), 2))
d <- paste0[d[, 1], d[, 2]]
e <- t(apply(d, 1, function(x) setdiff(c("A", "B", "D", "E"), x)))
k3 <- data.frame(d, e)
colnames(k3) <- paste0("G", 1:3)
k3 <- data.frame(sapply(g, function(x) gsub("B", "BC", x)))
k3
#    G1 G2 G3
# 1 ABC  D  E
# 2  AD BC  E
# 3  AE BC  D
# 4 BCD  A  E
# 5 BCE  A  D
# 6  DE  A BC

This does not match your k3 exactly, but it is more consistent with k2.

dcarlson
  • 10,936
  • 2
  • 15
  • 18