【问题标题】:R data.table How to generalize multiple join in loop?R data.table 如何概括循环中的多个连接?
【发布时间】:2021-06-07 09:04:43
【问题描述】:

在我在这里获得了许多帮助之后,我成功地运行了这些下一个特定的连接。一步一步,我正在更新我的主要 DT:

DT1 <- data.table(crit = rep(c('AA', 'BB', 'CC', 'DD'),each = 3),
                  num = rep(1:3, 4), 
                  val = rnorm(12)^2)
DT1

DT2 <- data.table(BB = c(1,3),
                  cross = c(128, 183))
DT2

DT3 <- data.table(DD = c(2,3),
                  cross = c(99, 787))
DT3

DT1[DT2[,  c(.(crit = 'BB'), .SD)] , cross := ifelse(is.na(cross), i.cross, cross), on = .(crit, num = BB)]
DT1[DT3[,  c(.(crit = 'DD'), .SD)] , cross := ifelse(is.na(cross), i.cross, cross), on = .(crit, num = DD)]

但是,我认为我需要通过mapply 循环。类似的东西:

mapply(fun.join, DTmain = DT1, DTsec = DT2, MoreArgs = list('BB'))
mapply(fun.join, DTmain = DT1, DTsec = DT3, MoreArgs = list('DD'))

但我似乎无法编写正确的函数 fun.join。

感谢您的帮助!

【问题讨论】:

  • 你想要的输出是什么?我看到很多奇怪的代码,我不知道你要去哪里。
  • 对不起,我没有注意到你的回答。我有两个主要的 data.table,DT1 和 DTX。从 DTX,我创建了许多子 DT(在我的示例中为 DT2、DT3 等)。然后,我必须将所有这些子 DT 与 DT1 连接起来,以便更新 DT1 中的同一列。

标签: r join data.table apply mapply


【解决方案1】:

你可以试试下面的代码

lapply(
  list(DT2, DT3),
  function(dt) {
    dt[
      ,
      c(stack(.SD[, 1]), .(cross = cross))
    ][
      DT1,
      on = .(ind = crit, values = num)
    ]
  }
)

给了

[[1]]
    values ind cross       val
 1:      1  AA    NA 0.1287103
 2:      2  AA    NA 2.0288966
 3:      3  AA    NA 0.8914414
 4:      1  BB   128 0.6451096
 5:      2  BB    NA 0.8424112
 6:      3  BB   183 0.3420138
 7:      1  CC    NA 0.4047142
 8:      2  CC    NA 0.7423724
 9:      3  CC    NA 1.3762432
10:      1  DD    NA 0.1086974
11:      2  DD    NA 6.0831923
12:      3  DD    NA 0.5619010

[[2]]
    values ind cross       val
 1:      1  AA    NA 0.1287103
 2:      2  AA    NA 2.0288966
 3:      3  AA    NA 0.8914414
 4:      1  BB    NA 0.6451096
 5:      2  BB    NA 0.8424112
 6:      3  BB    NA 0.3420138
 7:      1  CC    NA 0.4047142
 8:      2  CC    NA 0.7423724
 9:      3  CC    NA 1.3762432
10:      1  DD    NA 0.1086974
11:      2  DD    99 6.0831923
12:      3  DD   787 0.5619010

【讨论】:

  • 我只是在测试你昨天给我的加入解决方案,看看它是否会更好。我会给你一个更新,但它似乎工作正常!
  • @Discus23 我的回答中有一些拼写错误,但现在已修复。请尝试当前版本。
猜你喜欢
  • 2017-05-03
  • 2016-11-12
  • 2016-07-20
  • 2013-12-21
  • 1970-01-01
  • 2021-06-25
  • 1970-01-01
  • 2012-05-22
  • 1970-01-01
相关资源
最近更新 更多