2014-03-31 86 views
4

我的问题基本上与此问题相同:data.table join then add columns to existing data.frame without re-copyr - data.table加入,然后将所有列从一个表添加到另一个

基本上我有一个模板的键,我想从其他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 
> 
+0

是的,但我想分配列'模板'。本质上,我想用许多'data.tables'来填充模板,比如'x'。例如,'x'将包含某些键的值,'y'将包含其他键的值。所以模板< - x [template]将不起作用。 – ezbentley

+0

@阿伦:我加了一些例子,希望澄清我的情况。 – ezbentley

+0

太好了,现在我明白你的意思了。怎么样[这篇文章](http://stackoverflow.com/a/22596160/559784)?你可以构造一个类似的表达式,并且每次都是“eval”。 – Arun

回答

6

只需创建一个函数,它的名字作为参数,并构建了表达你。然后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 
相关问题