2017-12-03 1 views
0

Das scheint mir eine so grundlegende Frage zu sein, dass ich fast sicher bin, dass es irgendwo hier in der Gegend behandelt werden muss, aber ich suche schon seit einiger Zeit und kann es einfach nicht tun finde die richtige Antwort.Transformierte gerichtete Dyaden in ungerichtete

Meine Daten sieht wie folgt aus:

data <- data.frame(col1 = c("A","A","B","B"), col2 = c("B","C","A","C"), value = c(1,2,3,4)) 

    col1 col2 value 
1 A B 1 
2 A C 2 
3 B A 3 
4 B C 4 

I col1 und col2 in eine Variable zusammenführen möchten, die die einzigartigen Dyaden in einem einzigen Vektor angibt. Es sollte egal sein, ob "A" und "B" ein Wert von col1 oder col2 sind. Jede Zeile, die "A" und "B" in col1 und col2 enthält, sollte den gleichen Wert der neuen Variablen erhalten. Ich habe versucht, tidyr dafür zu benutzen.

unite(data, col1, col2, col="dyad", sep="_") 

kehrt

dyad value 
1 A_B 1 
2 A_C 2 
3 B_A 3 
4 B_C 4 

Grundsätzlich müssen I Dyade den gleichen Wert für A_B und B_A enthalten, weil diese Paare für mich gleichwertig sind. So sollte es aussehen, zum Beispiel:

dyad value 
1 A_B 1 
2 A_C 2 
3 A_B 3 
4 B_C 4 

Gibt es einen einfachen Weg, dies zu tun? Danke vielmals!

Antwort

0

Eine Lösung dplyr verwenden. Beachten Sie, dass ich beim Erstellen des Datenrahmens stringsAsFactors = FALSE hinzugefügt habe, da es in diesem Fall besser ist, an Zeichenspalten zu arbeiten.

data <- data.frame(col1 = c("A","A","B","B"), col2 = c("B","C","A","C"), value = c(1,2,3,4), 
        stringsAsFactors = FALSE) 

library(dplyr) 

data2 <- data %>% 
    rowwise() %>% 
    mutate(dyad = paste(sort(c(col1, col2)), collapse = "_")) %>% 
    select(dyad, value) %>% 
    ungroup() 
data2 
# # A tibble: 4 x 2 
# dyad value 
# <chr> <dbl> 
# 1 A_B  1 
# 2 A_C  2 
# 3 A_B  3 
# 4 B_C  4 
1

Es kann elegantere Lösungen sein, aber vielleicht hilft:

data <- data.frame(col1 = c("A","A","B","B"), col2 = c("B","C","A","C"), value = c(1,2,3,4), 
       stringsAsFactors = FALSE)  
data$dyad <- apply(data[,c("col1","col2")], 1, FUN= function(x) paste(sort(x), collapse="_")) 

So ist die Anwendung Funktion stellt sicher, dass die Funktion jeder Zeile des Datenrahmens angewendet wird. Die Funktion sortiert zuerst die Eingabe und fügt sie dann zusammen.

EDIT: Ich kopierte stringsAsFactors = FALSE von der anderen Antwort, wie ich es auch verwendet, aber vergessen, es sind in meinem Beitrag :)

Verwandte Themen