2016-05-22 29 views
4

首先,我想創建一個列名的空數據表,但它失敗:data.table(VA,VB,VC)如何使用列名創建一個空的數據表,然後向其添加數據表?

data=data.table(va, vb, vc) 

錯誤:對象 'VA' 未找到

然後,我要追加到數據表,但它也失敗:在merge.data.table

data2=data.table(va=c(-1,0,1), vb=c(-1,0,1), vc=c(-1,0,1)) 
data2 
    va vb vc 
1: -1 -1 -1 
2: 0 0 0 
3: 1 1 1 
merge(data2,data2) 

錯誤(數據2,數據2): 無法匹配x和y中的鍵以自動確定適當的by參數。請明確設置by值。

顯然該函數不能用兩個相同的數據表標識by參數。任何想法 ?即使

> data 
Empty data.table (0 rows) of 3 cols: va,vb,vc 

做自連接在所有列使用(:

+0

「對象VA」找不到是因爲[R假定它是一個變量名,也沒有存在的變量在您的工作空間命名'va' –

+0

要創建一個空的data.table使用(假設所有列的數字):'data = data.table(va = numeric(),vb = numeric(),vc = numeric())' –

+0

動態生長的東西在一個循環中(這聽起來像你在做什麼)在R中是一個壞主意。 – Frank

回答

7

要創建一個空的data.table使用(假設所有列是數字的):

library(data.table)  
data=data.table(va=numeric(), vb=numeric(), vc=numeric()) 
data 

導致結果是相同的;-):

data2=data.table(va=c(-1,0,1), vb=c(-1,0,1), vc=c(-1,0,1)) 
data2 
merge(data2,data2,by=names(data2)) 

之所以你必須指定by參數是merge所記錄的語義:

由:

在x和y共享列名合併上的載體。這默認 到兩個表之間的共享鍵列。如果y沒有鍵 列,則默認爲x的鍵。

由於您沒有設置任何鍵,因此合併數據表的「連接」列尚不清楚。

如果省略參數by,則不會隱含「使用所有列」語義。如果您覺得有差距,請向data.table軟件包的作者提出變更請求。

要將data.table的所有行追加到另一個使用rbind( 「行綁定」),而不是merge

data3 <- rbind(data2,data2) 
data3 

導致:

> data3 
    va vb vc 
1: -1 -1 -1 
2: 0 0 0 
3: 1 1 1 
4: -1 -1 -1 
5: 0 0 0 
6: 1 1 1 
5

要創建清空data.table,你可以從一個空矩陣開始:

library(data.table) 
data <- setNames(data.table(matrix(nrow = 0, ncol = 3)), c("va", "vb", "vc")) 
data 
Empty data.table (0 rows) of 3 cols: va,vb,vc 

然後喲你可以使用rbindlist追加新的數據。表吧:

data2=data.table(va=c(-1,0,1), vb=c(-1,0,1), vc=c(-1,0,1)) 
data2 
    va vb vc 
1: -1 -1 -1 
2: 0 0 0 
3: 1 1 1 
rbindlist(list(data, data2)) 
    va vb vc 
1: -1 -1 -1 
2: 0 0 0 
3: 1 1 1 

或者更簡單,以下也適用:

data <- data.table() 
data <- rbindlist(list(data, data2)) 
data 
    va vb vc 
1: -1 -1 -1 
2: 0 0 0 
3: 1 1 1 
相關問題