2016-04-22 26 views
0

Ich bin neu in R und Programmierung im Allgemeinen. Ich habe diese Daten: screenshotenter image description hereKonvertieren von Daten in Datenrahmen

Ich habe 12 "IDs" (Forschungsthemen), nummeriert 1-12. Die Spalte "Typen" gibt den "Typ" jeder ID an. Zum Beispiel beziehen sich die ersten 5 Nummern der Spalte "Typen" auf die "Typen" der ersten 5 IDs, d. H. "Typen" der ersten 5 IDs sind jeweils 3,3,2,1,1.

Die Spalte "Paare" beschreibt, wie IDs miteinander verknüpft werden. Zum Beispiel wird 6 mit 9 gepaart; 4 ist mit 7 gepaart; 1 ist gepaart mit 11 und so weiter.

Was ich brauche Hilfe mit ist, dass ich drei Spalten mit diesen Daten erstellen möchte.

erste Spalt: listet die ID (1-12)
zweite Spalte: die ID des Paares kehrt (wie 1 mit 11 gekoppelt wurde, sollte so zweite Spalte 11 für sagt ID 1)
dritte Spalte. teilt den ‚Typen‘ des Paares (so ‚Typ‘ von 11 3. dritter Spalte ist, sollte die Anzeige

Hier ist eine Darstellung des Formates gewünschten Ausgangs: output format enter image description here

Jede Hilfe wäre sehr willkommen. Vielen Dank im Voraus!

Antwort

1

Sie können dies mit einer cleveren Indizierung tun. Ich trat in den Rohdaten als Vektor für die Typen, und eine Liste von Vektoren für Paare:

# Enter the raw data 
type <- c(3, 3, 2, 1, 1, 1, 2, 3, 1, 1, 3, 1) 
pairs <- list(c(6, 9), c(4, 7), c(1, 11), c(3, 10), c(2, 12), c(5, 8)) 

Von diesem können Sie die ersten beiden Spalten der gewünschten Ausgabe erzeugen, indem alle Paare einmal in ihrer ursprünglichen Stapel Reihenfolge und dann wieder in umgekehrter Reihenfolge. (I umgekehrt jedes Paar von lapply(pairs, rev) verwenden, die zu jedem Paar in der Liste den rev Befehl gilt.)

# Create a 12 x 2 matrix of the pairs 
pairs.mat <- do.call(rbind, c(pairs, lapply(pairs, rev))) 
pairs.mat 
#  [,1] [,2] 
# [1,] 6 9 
# [2,] 4 7 
# [3,] 1 11 
# [4,] 3 10 
# [5,] 2 12 
# [6,] 5 8 
# [7,] 9 6 
# [8,] 7 4 
# [9,] 11 1 
# [10,] 10 3 
# [11,] 12 2 
# [12,] 8 5 

Für Sauberkeit von Ergebnissen, ich diese in eine data.frame umgewandelt:

# Convert to data frame 
colnames(pairs.mat) <- c("id", "match") 
df <- as.data.frame(pairs.mat) 

Schließlich Wir können die type_match-Spalte abrufen, indem wir type in der Reihenfolge der Übereinstimmungsspalte von der data.frame, die wir gerade erstellt haben, nehmen.

# Add in the type_match column 
df$type_match <- type[df$match] 

# Print results in order 
df[order(df$id), ] 
# id match type_match 
# 3 1 11   3 
# 5 2 12   1 
# 4 3 10   1 
# 2 4  7   2 
# 6 5  8   3 
# 1 6  9   1 
# 8 7  4   1 
# 12 8  5   1 
# 7 9  6   1 
# 10 10  3   2 
# 9 11  1   3 
# 11 12  2   3 

Und das sollte Ihnen die gewünschte Ausgabe geben.

+0

Danke für die Hilfe! Nur noch eine Sache: Gibt es für die 'Pairs'-Liste am Anfang eine Möglichkeit, diese Paarungen direkt aus der .csv-Datei auszulesen? Der Grund dafür ist, dass ich nur das Bild einer Paarung gegeben habe; es gibt mehrere mehr. Also, ich hatte gehofft, eine Funktion zu schreiben, die die Paarungssequenz aus einer .csv-Datei für jede Runde liest und dann mit dem Code fortfährt, den Sie zur Verfügung gestellt haben. Noch einmal vielen Dank für die Hilfe! –

+0

@AkhtarShah Wahrscheinlich, aber wie sieht die CSV aus? –

+0

[Dropbox Link zu CSV-Datei] (https://www.dropbox.com/s/7icth1rmv9801i3/config_custom_short_72.csv?dl=0) Weiß nicht, wie man das in den Kommentaren teilen; Daher die Verbindung. –

Verwandte Themen