2017-02-28 72 views
1

我在Excel中使用了很多vlookup公式,我嘗試使用data.table包在R中進行轉置。使用R在列中匹配值 - excel vlookup

在我下面的例子中,我要說,對於每一行,找到列x中的列y中的值,並返回列z中的值。

第一行的結果爲na,因爲值6在列x中不存在。

在第二行的值5出現在x柱兩次,但返回的第一場比賽是好的,這是在這種情況下

我在結果列這是預期結果添加e

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")) 

非常感謝

+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- – jogo

回答

1

我們可以只使用match與的「X」找到「Y」的那些匹配元素的索引,並使用該索引來得到相應的「Z」

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

感謝它的完美運作。 – MidnightDataGeek

2

您可以用加入做到這一點,但需要先更改順序:

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 

我沒有測試這個數據是否比match更快,但它可能是。

+1

而不是排序,有'dt [,res:= dt [。(y),on =。(x),z,mult =「first」]] – Frank

+0

只想知道你使用什麼版本的DT,無法執行上述任何示例?我得到了'找不到函數'。「」對於Rolands的回答和Frank的錯誤 - ''on'參數應該是一個已命名的原子向量「我使用的是1.9.6仍然是 – MidnightDataGeek

+1

@MidnightDataGeek顯然是當前的CRAN版本。 1.9.6是舊的。 – Roland