动态构建查询多列的调用

jan*_*cki 11 lookup r dynamic data.table

如何使用字符向量变量作为参数动态查找多个字段并通过引用添加.在下面的情况下,我想查找两列并删除i.它们中的前缀.当然,他们可以覆盖具有相同名称的现有列.

library(data.table)
set.seed(1)
ID <- data.table(id = 1:3, meta = rep(1,3), key = "id")
JN <- data.table(idd = sample(ID$id, 3, FALSE), value = sample(letters, 3, FALSE), meta = rep(1,3), key = "idd")
select <- c("value","meta") # my fields to lookup
j.lkp <- call(":=", select, lapply(paste0("i.",select), as.symbol))
j.lkp
# `:=`(c("value", "meta"), list(i.value, i.meta))
ID[JN, eval(j.lkp)]
# Error in eval(expr, envir, enclos) : could not find function "i.value"
ID[JN, `:=`(c("value", "meta"), list(i.value, i.meta))]
#    id meta value
# 1:  1    1     x
# 2:  2    1     v
# 3:  3    1     f
Run Code Online (Sandbox Code Playgroud)

我知道类似的问题,但是这个问题在加入期间要求矢量化参数并直接构建调用j.
编辑:我知道我可以使用.SDcols但我不能通过引用执行此操作

edd*_*ddi 9

这对我来说似乎是最直接的方式:

ID[JN, (select) := mget(paste0('i.', select))]
Run Code Online (Sandbox Code Playgroud)

  • 试试1.9.5 - 这就是我正在使用的 (2认同)

Fra*_*ank 5

这是粗俗的方式:

myj <- parse(text=paste0("`:=`(",paste0(select,"=i.",select,collapse=","),")"))
ID[JN,eval(myj)]
#    id meta value
# 1:  1    1     x
# 2:  2    1     v
# 3:  3    1     f
Run Code Online (Sandbox Code Playgroud)


jan*_*cki 5

而不是mgeteval-parse仍然有可能构建查找调用.虽然它mget是最友好的用户,但这个是灵活的,实际上对应于构建j表达式.
解包装到batch.lookup辅助函数中,将列名的字符向量进行查找.

library(data.table)
set.seed(1)
ID <- data.table(id = 1:3, meta = rep(1,3), key = "id")
JN <- data.table(idd = sample(ID$id, 3, FALSE), value = sample(letters, 3, FALSE), meta = rep(1,3), key = "idd")
select <- c("value","meta") # my fields to lookup

batch.lookup = function(x) {
    as.call(list(
        as.name(":="),
        x,
        as.call(c(
            list(as.name("list")),
            sapply(x, function(x) as.name(paste0("i.",x)), simplify=FALSE)
        ))
    ))
}
batch.lookup(select)
#`:=`(c("value", "meta"), list(value = i.value, meta = i.meta))
ID[JN, eval(batch.lookup(select))][]
#   id meta value
#1:  1    1     x
#2:  2    1     v
#3:  3    1     f
Run Code Online (Sandbox Code Playgroud)

公平地说,这个答案实际上解决了我所描述的呼叫建设问题OP.