2014-09-10 7 views
2

Je Col. ai un dataframe comme celui-cir trouver un à une liaison entre 2

df <- data.frame(g1=c("x1","x2","x2","x3","x4"), 
       g2=c("y1","y1","y2","y3",NA), 
       stringsAsFactors = FALSE) 

Chaque ligne indique un certain x est liée à une certaine y de la même rangée.

Comment trouver combien de x et y sont liés de manière unique, sans compter na?

Comme dans ce cas, seulement 1 liaison unique x3 à y3.

Merci.

Répondre

0

Il existe de meilleures façons de le faire, mais cela fonctionne.

Df[sapply(Df2[,1], function(x) (sum(x == (d <- sapply(Df, substring, first = 2))[,2], na.rm=T)==1)&(sum(x == d[,1], na.rm=T)==1)),] 
> g1 g2 
    x3 y3 
2

Vous pouvez obtenir tous les appariements avec table()

tt <- do.call(table, Df) 

puis trouver ces cellules avec un match qui ont des zéros dans le reste des cellules de la ligne partagée/colonne

uv <- arrayInd(which(rowSums(tt)[row(tt)] == 1 & colSums(tt)[col(tt)]==1 & tt>0), .dim=dim(tt)) 

Maintenant extraire les noms de ces cellules

cbind(rownames(tt)[uv[,1]], colnames(tt)[uv[,2]]) 

#  [,1] [,2] 
# [1,] "x3" "y3" 

donc ici nous obtenons x3, appariement Y3 vous avez voulu former votre échantillon

3

Si je comprends bien votre question, vous cherchez les lignes de votre trame de données où la valeur g1 et la valeur g2 sont à la fois unique. Vous pouvez vérifier les valeurs uniques en R avec la fonction duplicated:

subset(df, !duplicated(g1) & !duplicated(g1, fromLast=TRUE) & !is.na(g1) & 
      !duplicated(g2) & !duplicated(g2, fromLast=TRUE) & !is.na(g2)) 
# g1 g2 
# 4 x3 y3 
1

Vous pourriez peut-être utiliser igraph. Si dans un graphique x et y sont liés de manière unique, ils ne seront pas connectés à d'autres nœuds - donc le graphique aura clusters. L'objectif est donc d'identifier les clippers de taille 2 et d'extraire les noms des nœuds.

# extend your data a little to include another unique link 
df <- data.frame(g1=c("x1","x2","x2","x3","x4","x7"), 
       g2=c("y1","y1","y2","y3",NA, "y8"), 
       stringsAsFactors = FALSE) 

library(igraph) 
g <- graph.data.frame(na.omit(df[,1:2])) 

plot(g) 

by(V(g)$name, clusters(g)$membership, as.character) [clusters(g)$csize==2] 
#$`2` 
#[1] "x3" "y3" 

#$`3` 
#[1] "x7" "y8" 

EDIT Suivi de commentaires

Vous pouvez attribuer des couleurs (et d'autres attributs) aux noeuds en utilisant V (g) $ couleur. Vous pouvez les affecter de manière conditionnelle.

Donc, pour colorer les noeuds avec un seul lien différemment

b <- by(V(g)$name, clusters(g)$membership, as.character) [clusters(g)$csize==2] 

V(g)$color <- ifelse(V(g)$name %in% unlist(b), "red", "blue") 

plot(g) 

Ou pour colorer chaque groupe différemment

V(g)$color <- c("red", "blue", "green")[clusters(g)$membership] 

plot(g) 

Jetez un oeil à ?V, ?clusters et ?plot.igraph pour plus d'options

+0

Cette est très intéressant. Existe-t-il un moyen d'appliquer également une couleur différente à ces paires un-à-un, soit le remplissage de vertice ou la bordure? Merci @ utilisateur20650 – santoku

+0

@santoku; vous êtes le bienvenu. S'il vous plaît voir modifier re la coloration des noeuds – user20650

Questions connexes