2017-02-28 4 views
1

Ich habe einen Datensatz in Excel mit einer Menge von vlookup Formeln, die ich versuche, in R mit dem Paket data.table zu transponieren.Übereinstimmende Werte in einer Spalte mit R - Excel vlookup

In meinem Beispiel unten, ich sage, für jede Zeile, finden Sie den Wert in der Spalte y innerhalb der Spalte x und geben Sie den Wert in der Spalte z.

Die erste Zeile führt zu na, da der Wert 6 in Spalte x nicht vorhanden ist.

Auf der zweiten Reihe 5 der Wert zweimal in Spalte erscheint x aber das erste Spiel der Rückkehr ist in Ordnung, die e in diesem Fall ist

Ich habe in der Ergebnisspalte hinzugefügt, die das erwartete Ergebnis ist.

library(data.table) 
dt <- data.table(x = c(1,2,3,4,5,5), 
y = c(6,5,4,3,2,1), 
z = c("a", "b", "c", "d", "e", "f"), 
Result = c("na", "e", "d", "c", "b", "a")) 

Vielen Dank

+0

http://stackoverflow.com/questions/18645222/vlookup-type-method-in-r, http://stackoverflow.com/questions/15303283/how-to-do-vlookup-and-fill-down -like-in-excel-in-r – jogo

Antwort

1

Wir können nur match den Index dieser passenden Elemente von ‚y‘ zu finden, mit dem der ‚x‘ und verwenden, die zum Indizieren der entsprechenden ‚Z‘ erhalten

dt[, Result1 := z[match(y,x)]] 
dt 
# x y z Result Result1 
#1: 1 6 a  na  NA 
#2: 2 5 b  e  e 
#3: 3 4 c  d  d 
#4: 4 3 d  c  c 
#5: 5 2 e  b  b 
#6: 5 1 f  a  a 
+0

Danke, es hat perfekt funktioniert. – MidnightDataGeek

2

Sie können dies tun, eine Verknüpfung mit, muss aber zuerst die Reihenfolge ändern:

setorder(dt, y) 
dt[.(x = x, z = z), result1 := i.z, on = .("y" = x)] 
setorder(dt, x) 
# x y z Result result1 
#1: 1 6 a  na  NA 
#2: 2 5 b  e  e 
#3: 3 4 c  d  d 
#4: 4 3 d  c  c 
#5: 5 1 f  a  a 
#6: 5 2 e  b  b 

ich habe nicht getestet, ob dies schneller ist als match für eine große data.table, aber es könnte sein.

+1

Anstatt zu sortieren, gibt es 'dt [, res: = dt [. (Y), on =. (X), z, mult =" zuerst "]]' – Frank

+0

Ich frage mich, welche Version von DT Sie beide verwenden, I Kann ich keines der obigen Beispiele ausführen? Ich bekomme '' Funktion nicht finden konnte. "' Für Rolands Antwort und ein Fehler auf Franks - ''on' Argument sollte ein benanntes Atomvektor sein ' Ich benutze 1.9.6 noch – MidnightDataGeek

+1

@ MidnightDataGeek Offensichtlich die aktuelle CRAN-Version. 1.9.6 ist alt. – Roland