【问题标题】:Matching values in a column using R - excel vlookup使用 R 匹配列中的值 - excel vlookup
【发布时间】:2017-02-28 09:50:32
【问题描述】:

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

在下面的示例中,我是说,对于每一行,在列 x 中找到列 y 中的值,并返回列 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"))

非常感谢

【问题讨论】:

标签: r data.table


【解决方案1】:

你可以通过加入来做到这一点,但需要先改变顺序:

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 对于大 data.table 更快,但它可能是。

【讨论】:

  • 不是排序,而是dt[, res := dt[.(y), on=.(x), z, mult="first"]]
  • 只是想知道你们都使用的是什么版本的DT,我无法执行上述任何示例?我得到could not find function "." 的 Rolands 答案和 Frank 的错误 - 'on' argument should be a named atomic vector 我仍在使用 1.9.6
  • @MidnightDataGeek 显然是当前的 CRAN 版本。 1.9.6 已经过时了。
【解决方案2】:

我们可以只用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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多