2016-06-07 1 views
0

Lassen Sie uns sagen, dass ich ein data.frame haben, die wie folgt aussieht:einen Datenrahmen Deduplizierung, wenn die Reihenfolge der Werte in R unterscheiden können

df = data.frame(from=c(1, 1, 2, 1), 
       to=c(2, 3, 1, 4), 
       title=c("A", "B", "A", "A"), 
       stringsAsFactors=F) 

df ein Objekt, das für ein Netzwerk Graph alle verschiedenen Verbindungen hält. Ich habe auch eine zweite data.frame, die die vereinfachte grafische Darstellung Daten:

df2 = data.frame(from=c(1, 1, 3), 
       to=c(2, 4, 1), 
       stringsAsFactors=F) 

Was ich brauche, ist die title Werte von df in df2 zu ziehen. Ich kann nicht einfach df deduplizieren, weil a) from und to in verschiedenen Ordnungen sein können, und b) title ist nicht einzigartig zwischen Verbindungen. Der aktuelle Zustand ich habe, ist:

df2$title = df$title[df2$from == df$from & df2$to == df$to] 

Dies führt jedoch in zu wenigen Zeilen aufgrund der Größenordnung von from und to in Reihe 2 von df2 umgekehrt wird. Wenn ich eine OR condtion einführe, bekomme ich zu viele Ergebnisse, weil die Verbindung zwischen 1 und 2 zweimal übereinstimmt.

Meine Frage ist dann, wie kann ich effektiv die title Variable "deduplizieren", um sie an df2 anzufügen?

Das erwartete Ergebnis ist folgendes:

from to title 
1  1  2  A 
2  1  4  A 
3  3  1  B 
+0

Was ist Ihre erwartete Ausgabe? – pbahr

+0

gerade hinzugefügt. Das tut mir leid. – brittenb

+0

Wenn es ungerichtet ist, sollten Sie einen Standard für sich selbst festlegen, von . 'muate (from2 = pmin (von, bis), bis = pmax (von, bis), von = von2)%>% select (-from2)'. – Gregor

Antwort

1
library(dplyr); 
merge(mutate(df2, from1 = pmin(from, to), to1 = pmax(from, to)), 
     mutate(df, from1 = pmin(from, to), to1 = pmax(from, to)), 
     by = c("from1", "to1"), all.x = T) %>% 
select(from1, to1, title) %>% unique() 

# from1 to1 title 
#1  1 2  A 
#3  1 3  B 
#4  1 4  A 

Ein anderer Weg, wir versuchen können, wo edgeSort Funktion einzigartige Kanten erzeugen, wenn die beiden Eckpunkte gleich sind und verwenden match Funktion alle gleich Kanten übereinstimmen.

edgeSort <- function(df) apply(df, 1, function(row) paste0(sort(row[1:2]), collapse = ", ")) 

df2$title <- df$title[match(edgeSort(df2), edgeSort(df))] 
df2 
    from to title 
1 1 2  A 
2 1 4  A 
3 3 1  B 
+1

Schließen, außer dass es einen Wert für 'title' geben sollte, wo' from == 3'. Ich füge die erwartete Ausgabe in meine Frage ein. – brittenb

+0

Also spielt die Reihenfolge von 'von' und' zu' keine Rolle? zum Beispiel können 'from = 3' und' to = 1' '' from = 1' und 'to = 3'? – Psidom

+1

Korrekt. Es sind Daten für ein ungerichtetes Diagramm, also ist es egal, in welcher Reihenfolge 'von' und' zu' sind. – brittenb

0

Ich denke, man es in der Basis R von 2 merge Aussagen machen kann:

step1 <- merge(df2, df, all.x = TRUE) 
step2 <- merge(df2[is.na(step1$title),], df, all.x = TRUE, by.x = c("to", "from"), by.y = c("from", "to")) 
rbind(step1[!is.na(step1$title),], step2) 

    from to title 
1 1 2  A 
2 1 4  A 
3 3 1  B 
Verwandte Themen