【问题标题】:R data.table Perform join on a function parametersR data.table 对函数参数执行连接
【发布时间】:2021-04-22 21:06:33
【问题描述】:

我想加入两个DT,假设一个key作为函数参数传递。

出了一个函数,运行良好,如下图:

DT1 = data.table(i=1:12, z=runif(12), toto=rep(1:3, each=4), tata=rep(21:23, each=4))
DT2 = data.table(j=1:3, num=1:3, crit=c('tata','toto','tutu'), nb=rnorm(3))

DT3 <- DT1[DT2[crit == 'toto'],
    ':=' (nb = nb),
    on = c(toto = 'num')]

很遗憾,我无法用函数重现它:

foo <- function(dt1, dt2, var){
  dt1[dt2[crit == var],
      ':=' (nb = nb),
      on = (var = 'num')]
}

DT1 = data.table(i=1:12, z=runif(12), toto=rep(1:3, each=4), tata=rep(21:23, each=4))
DT2 = data.table(j=1:3, num=1:3, crit=c('tata','toto','tutu'), nb=rnorm(3))

DT4 <- foo(dt1 = DT1, dt2 = DT2, var = 'toto')

我尝试了诸如get(var) = 'num'之类的方法,但没有成功。

非常感谢您的帮助!

【问题讨论】:

    标签: r function join data.table


    【解决方案1】:

    ?data.table,“从 v1.9.8 开始,您还可以使用二元运算符 == 来表示外键连接,例如 X[Y, on=c("x1==y1", "x2==y2" )]"。

    因此,我们可以使用

    foo <- function(dt1, dt2, var){
      dt1[dt2[crit == var], `:=` (nb = nb), on = paste(var,'== num')]
    }
    

    或者,您也可以使用merge.data.table

    foo2 <- function(dt1, dt2, var){
      merge.data.table(DT1, dt2[crit == var, .(num,nb)], by.x=var, by.y='num', all=T)
    }
    

    【讨论】:

    • 我找这个已经很久了...非常感谢!!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-28
    • 2012-11-09
    • 1970-01-01
    • 2014-10-15
    • 2018-11-08
    • 2015-04-29
    相关资源
    最近更新 更多