使用R匹配列中的值 - excel vlookup

时间:2017-02-28 09:50:33

标签: r data.table

我在Excel中有一个数据集,其中包含很多vlookup公式,我试图使用data.table包在R中进行转置。

在下面的示例中,我要说的是,对于每一行,在列y中的列x中找到值,并返回列z中的值。

第一行产生na,因为6列中的值x不存在。

在第二行,值5x列中出现两次,但返回第一个匹配很好,在这种情况下为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"))

非常感谢

2 个答案:

答案 0 :(得分: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 :(得分:1)

我们可以使用match找到'y'匹配元素的索引与'x'的索引,并使用它来索引以获得相应的'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