【问题标题】:r - data.table join and then add all columns from one table to anotherr - data.table 连接,然后将一个表中的所有列添加到另一个表
【发布时间】:2014-03-31 17:08:29
【问题描述】:

我的问题与这个问题基本相同:data.table join then add columns to existing data.frame without re-copy

基本上我有一个带有键的模板,我想通过相同的键将其他 data.tables 中的列分配给模板。

> template
    id1 id2
 1:   a   1
 2:   a   2
 3:   a   3
 4:   a   4
 5:   a   5
 6:   b   1
 7:   b   2
 8:   b   3
 9:   b   4
10:   b   5
> x
   id1 id2       value
1:   a   2  0.01649728
2:   a   3 -0.27918482
3:   b   3  0.86933718
> y
   id1 id2     value
1:   a   4 -1.163439
2:   b   4  2.267872
3:   b   5  1.083258
> template[x, value := i.value]
> template[y, value := i.value]
> template
    id1 id2       value
 1:   a   1          NA
 2:   a   2  0.01649728
 3:   a   3 -0.27918482
 4:   a   4 -1.16343917
 5:   a   5          NA
 6:   b   1          NA
 7:   b   2          NA
 8:   b   3  0.86933718
 9:   b   4  2.26787248
10:   b   5  1.08325793
> 

但如果xy 有100 列,则不可能为所有列写出value := i.value 语法。除了xy 中的所有列,有没有办法做同样的事情?

编辑: 如果我做y[x[template]],那么它会创建单独的value 列,这不是有意的:

> y[x[template]]
    id1 id2     value     value.1
 1:   a   1        NA          NA
 2:   a   2        NA  0.01649728
 3:   a   3        NA -0.27918482
 4:   a   4 -1.163439          NA
 5:   a   5        NA          NA
 6:   b   1        NA          NA
 7:   b   2        NA          NA
 8:   b   3        NA  0.86933718
 9:   b   4  2.267872          NA
10:   b   5  1.083258          NA
> 

【问题讨论】:

  • 是的,但我想将列分配给template。本质上,我想用许多data.tables 填充模板,例如x。例如,x 将包含一些键的值,y 将包含一些其他键的值。所以模板
  • @Arun:我添加了一些示例以希望澄清我的情况。
  • 太好了,现在我明白你的意思了。 this post 怎么样?您可以构造一个类似的表达式,每次只需eval
  • 我认为该帖子会起作用。我希望会有更优雅的语法。谢谢。

标签: r data.table


【解决方案1】:

只需创建一个将名称作为参数并为您构造表达式的函数。然后 eval 每次传递您需要的每个 data.table 的名称。这是一个插图:

get_expr <- function(x) {
    # 'x' is the names vector
    expr = paste0("i.", x)
    expr = lapply(expr, as.name)
    setattr(expr, 'names', x)
    as.call(c(quote(`:=`), expr))
}

> get_expr('value')    ## generates the required expression
# `:=`(value = i.value)

template[x, eval(get_expr("value"))]
template[y, eval(get_expr("value"))]

#     id1 id2       value
#  1:   a   1          NA
#  2:   a   2  0.01649728
#  3:   a   3 -0.27918482
#  4:   a   4 -1.16343900
#  5:   a   5          NA
#  6:   b   1          NA
#  7:   b   2          NA
#  8:   b   3  0.86933718
#  9:   b   4  2.26787200
# 10:   b   5  1.08325800

【讨论】:

    猜你喜欢
    • 2018-01-13
    • 2015-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    • 2021-08-18
    • 1970-01-01
    相关资源
    最近更新 更多