2016-04-20 7 views
1

Ich habe einen Datenrahmen mit 600 Zeilen, die eine Zeichenvariable (IDs) enthält, die durch Komma getrennte Zahlen enthält.Vergleichen Sie Datenrahmen mit Vektor und erstellen Sie neue Variable für übereinstimmenden Wert

name ids 
x  8,5,23,56,78,44,54 
y  5,7,23,44 
z  8,44,2 

Ich wollte die obigen Werte mit drei verschiedenen Vektoren vergleichen, die numerische Werte enthält.

a=c(5,7,9,3) 
b=c(8,23,78,66,4) 
c=c(44,54,2,90) 

Ich brauche für die Vektoren in dem Datenrahmen drei neue Spalten erstellen, die die Werte von IDs enthalten, die mehr als einmal übereinstimmt in dem jedem Vektor

name ids    a   b   c 
x 8,5,23,56,78,44,54 NA  8,23,78  44,54 
y 5,7,23,44    5,7  NA   NA 
z 8,44,2    NA  NA   44,2 

ich habe wirklich keine Ahnung, wie man dies vergleicht, da beide verschiedene Typen sind und wenn ich einmal vergleiche und wie man die Werte wie oben erhalten kann.

Antwort

1

Wir, die Vektoren in einem list, durchlaufen sie setzen können, split der ‚IDs‘ Spalte in der ‚data.frame‘ durch ‚‘ in ein list die Vektoren der Teilmenge basierend auf den gefundenen Elementen %in% das Split list , erstellen Sie eine Ausnahme, um NA zurückzugeben, wenn die length der Teilmenge 1 oder else wir paste (dh toString) zusammen ist und die Ausgabe zurück zu neuen Spalten in 'df1' zuweisen.

df1[letters[1:3]] <- lapply(list(a, b, c), function(x) 
    sapply(strsplit(df1$ids, ","), function(y) { 
     x1 <- x[x %in% as.numeric(y) ] 
    if(length(x1)>1) toString(x1) else NA 
})) 
+0

Das funktioniert einwandfrei ausgeführt. Eine weitere Sache, anstelle von Buchstaben, sagen, wenn ich die Spalte als Name der Vektoren nennen möchte, was getan werden soll. Wenn jeder Vektor als kommerziell, regulär, dringend statt a, b, c bezeichnet wird. Ich danke dir sehr. – ssan

+0

@ssan Sie können 'df1 [c (" a "," b "," c ")] <-' verwenden. Es ist einfach, dies manuell zu tun, wenn nur ein paar Spalten vorhanden sind. – akrun

+1

Vielen Dank! – ssan