簡體   English   中英

動態構建查找多列的調用

[英]Dynamically build call for lookup multiple columns

如何使用字符向量變量作為參數動態查找多個字段並按引用添加 在下面的情況下,我想查找兩列並去掉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

我知道類似的問題,但這個問題在 join 期間要求矢量化參數,並直接為j構建調用。
編輯:我知道我可以使用.SDcols來做到這.SDcols但后來我無法通過參考執行此操作

這對我來說似乎是最直接的方法:

ID[JN, (select) := mget(paste0('i.', select))]

在最近的開發版本中,它變得更加容易

ID[JN, (select) := .list_of_fields,
   env=list(.list_of_fields=as.list(paste0('i.', select)))]

1.14.1 之前的舊解決方案

除了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

公平地說,這個答案實際上解決了我描述為 OP 的呼叫構建問題。

這是粗略的方法:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM