2013-05-12 47 views
1

我有兩個data.tables(datresults)共享列名。在附註中,results保存了早先在* sub * dat組中計算出的彙總統計。換句話說,nrow(results) != nrow(dat)(但我不認爲這與問題有關) 現在我想通過向datJ()中的列名衝突/重複?

添加一個新列(即NewColZ)將這些結果合併回 dat(即原始data.table)

dat[,list(colA,colB,NewColZ=results1[colX==colX & colY==colY,colZ]) 
    ,by=list(colX, colY)] 

爲什麼:

我希望這不工作?因爲「colX」和「colY」是兩個data.tables(即dat和results)中的列名。我想說的是,results1[take_from_self(colX)==take_from_parent(colX)]

因此以下工作(注意,我只改名爲列)

dat[,list(colA,colB,NewCol=results1[cx==colX & cy==colY,colZ,]) 
    ,by=list(colX, colY)] 

雖然我有一種感覺,這可以簡單方便地通過一個連接來完成。但是dat有更多的列比results

+0

其中是父'colX'和'colY'來自哪裏。另外,你有沒有閱讀常見問題?這是在那裏解決 – 2013-05-12 21:36:43

+0

take_from_parent()只是指dat dat.table。此外,常見問題解答對j的範圍規則提出了一個問題,但在這裏我正在尋找i的範圍規則。 – varuman 2013-05-12 22:06:25

+1

-1,我們可以有/一個數據?你期望代碼做什麼(以一種清晰的方式)?而這又是怎麼回事(再一次,以一種清晰簡潔的方式)?這是一個格式不太好的問題ATM。在對這個問題作出重大改變後,我很樂意投票贊成。 – Arun 2013-05-12 22:11:15

回答

1

你正在嘗試做的是colXcolY一個join。您可以使用:=按引用進行分配。當你有獨特的組合(這我假設你做的)

keys <- c('colX', 'colY') 
setkeyv(dat, keys) 
setkeyv(results, keys) 

dat[results, newcolZ := colZ] 
# perhap use `i.` if there is a colZ in dat 
# dat[results, newcolZ := i.colZ] 

我與建議您閱讀常見問題解答和介紹護身符以及通過許多例子中?data.table去評論同意加入是最直接的。

你的問題是一個範圍問題,但你的主要問題是沒有完全意識到data.table成語。 join方法是獨特的data.table方法。