2014-03-31 108 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 
相關問題