Fusionner un champ en ligne et en colonne
Bonjour à tous,
Je cherche à faire une opération qui semble simple au premier abord mais sur laquelle je peine depuis quelques jours.
Je cherche en effet à fusionner (joindre) un tableau sur une matrice, avec fusion en ligne et en colonne d'un champ.
Il s'agit d'une matrice dont les noms de lignes et de colonnes sont identiques (origine / destination). Il y a donc le même nb de lignes que de colonnes.
Les lignes et les colonnes de cette matrice sont les identifiants :
Code:
1 2 3 4 5
|
001 002 003
001 x x x
002 x x x
003 x x x |
Je voudrais créer une colonne et une ligne supplémentaires à partir d'un tableau du type suivant :
Code:
1 2 3 4
|
001 oui
002 oui
003 non |
afin d'obtenir
Code:
1 2 3 4 5 6
|
001 002 003 c4
001 x x x oui
002 x x x oui
003 x x x non
l4 oui oui non |
Mais je n'y parviens pas.
Je suis habitué à utiliser merge (ce qui pourrait résoudre le pb pour les lignes) mais je ne parviens pas à le faire pour les lignes et les colonnes.
Est-ce que certains d'entre vous sauraient faire ça ?
Merci par avance,
G.
Fusionner un champ en ligne et en colonne
Bonjour,
Une autre approche :
• Si toutes les lignes sont communes et dans le même ordre, il est possible d'utiliser les fonctions bind_cols() et bind_rows() du package dplyr :
Code:
1 2 3 4 5 6 7 8
| > M <- matrix(c("A","B","C", "D","E","F", "G","H","I"),ncol=3,
+ dimnames = list(c("001","002","003"),c("001","002","003")))
> M.df <- as.data.frame(M)
> M.df
001 002 003
001 A D G
002 B E H
003 C F I |
Code:
1 2 3 4 5 6 7 8
| V <- matrix(c("oui", "oui", "non"),
dimnames = list(c("001","002","003"),names="V4"))
> V.df <- as.data.frame(V)
> V.df
V4
001 oui
002 oui
003 non |
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| > library(dplyr)
> T.df <- bind_cols(M.df,V.df)
> T.df <- bind_rows(T.df,as.data.frame(t(V.df)))
Warning messages:
1: In bind_rows_(x, .id) : Unequal factor levels: coercing to character
2: In bind_rows_(x, .id) :
binding character and factor vector, coercing into character vector
...
> row.names(T.df) <- names(T.df)
> T.df
001 002 003 V4
001 A D G oui
002 B E H oui
003 C F I non
V4 oui oui non <NA> |
• S'il manque des lignes ou qu'elles ne sont pas dans le même ordre, il est possible d'utiliser la fonction merge() et la fonction bind_rows() :
Code:
1 2 3 4 5 6 7 8 9
| > M <- matrix(c("A","B","C", "D","E","F", "G","H","I"),ncol=3,
+ dimnames = list(c("001","002","003"),c("001","002","003")))
> M.df <- as.data.frame(M)
> M.df$id <- row.names(M.df)
> M.df
001 002 003 id
001 A D G 001
002 B E H 002
003 C F I 003 |
Code:
1 2 3 4 5 6 7 8
| > V <- matrix(c("non","oui"),
+ dimnames = list(c("003","001"),"V4"))
> V.df <- as.data.frame(V)
> V.df$id <- row.names(V.df)
> V.df
V4 id
003 non 003
001 oui 001 |
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| > T.df <- merge(M.df,V.df,by="id",all=TRUE)[,-1]
> library(dplyr)
> T.df <- bind_rows(T.df,as.data.frame(t(V.df)))[-length(T.df),]
Warning messages:
1: In bind_rows_(x, .id) : Unequal factor levels: coercing to character
2: In bind_rows_(x, .id) :
binding character and factor vector, coercing into character vector
> row.names(T.df) <- names(T.df)
> T.df
001 002 003 V4
001 A D G oui
002 B E H <NA>
003 C F I non
V4 oui <NA> non <NA> |
Cordialement,