我在Excel中有一个数据集,其中包含很多vlookup公式,我试图使用data.table包在R中进行转置。
在下面的示例中,我要说的是,对于每一行,在列y
中的列x
中找到值,并返回列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 :(得分: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