2 votes

Combinaisons de chaque chaîne d'une colonne avec chaque chaîne d'une autre colonne en R

Il s'agit de la table avec de nombreuses lignes, mais pour simplifier le problème...

dt1 <-data.frame(col1=c("C,Y,M","B,C,M,A"),col2=c("B,E,M","B,A,G"),col3=c("2","10"))

     col1          col2         col3
1    C,Y,M         B,E,M        2
2    B,C,M,A       B,F,G        10

Donc ce que j'essaie de faire est

1. chaque chaîne de chaque colonne doit être appariée, mais si une chaîne commune est présente, elle est ignorée, par exemple C avec B, C avec E mais pas C avec M car M est présent dans les deux colonnes de cette ligne et de même Y avec B, Y avec E encore une fois pas avec M.

2. Leurs valeurs correspondantes comme col3

le tableau de sortie

dt2 <- data.frame(col1 =c("C","C","Y","Y","C","C","M","M","A","A"),col2 = c("B","E","B","E","F","G","F","G","F","G"),col3=c("2","2","2","2","10","10","10","10","10","10"))

  col1      col2       col3
1    C         B          2  
2    C         E          2
3    Y         B          2
4    Y         E          2
5    C         F         10
6    C         G         10
7    M         F         10
8    M         G         10
9    A         F         10
10   A         G         10

2voto

Ananda Mahto Points 67213

Peut-être pouvez-vous essayer quelque chose comme ceci (notez qu'il y a une erreur dans vos données d'exemple....) :

dt1 <- data.frame(col1 = c("C,Y,M","B,C,M,A"), 
                  col2 = c("B,E,M","B,F,G"), 
                  col3 = c("2","10"))

x <- lapply(dt1, function(x) strsplit(as.character(x), ",", TRUE))

myFun <- function(x, y, z) {
  drop <- intersect(x, y)
  expand.grid(x[!x %in% drop], y[!y %in% drop], z)
}

do.call(rbind, Map(myFun, x[[1]], x[[2]], x[[3]]))
#    Var1 Var2 Var3
# 1     C    B    2
# 2     Y    B    2
# 3     C    E    2
# 4     Y    E    2
# 5     C    F   10
# 6     M    F   10
# 7     A    F   10
# 8     C    G   10
# 9     M    G   10
# 10    A    G   10

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