2013-10-11 87 views
2

我試圖加入兩個數據表。第一個(下面稱爲'左')有一組鍵(列'k')。第二個('右')有一組類似的鍵以及每個鍵的值。我想在原地更新'左'數據,以便它存在的地方具有'正確'的值。但是在不存在的情況下,應該填充默認值而不是NA。R Data.Table加入 - 將「缺少」從NA轉換爲默認值

我創建了一個函數'default',它將用默認值替換NA。

default <- function(value, default) { 
    value[is.na(value)] <- default 
    return(value) 
} 

我不明白爲什麼以下不起作用。

left <- data.table(k=c(1,2,3,4,NA), key="k") 
right <- data.table(k=c(1,2), value=c("a","b"), key="k") 
left[right, value := default(value,"none")] 

實際結果......

> left 
    k value 
1: NA NA 
2: 1  a 
3: 2  b 
4: 3 NA 
5: 4 NA 

預期結果......

k value 
1: NA none 
2: 1  a 
3: 2  b 
4: 3 none 
5: 4 none 

感謝您的幫助。

+0

看看'左[右]',應該明確地告訴你,爲什麼你的方法沒有奏效 – eddi

+0

我只是做' right [left] [is.na(value),value:=「none」]' – eddi

回答

4

你可以這樣來做:

right[left, list(value=default(value,"none"))] 

其中給出:

k value 
1: NA none 
2: 1  a 
3: 2  b 
4: 3 none 
5: 4 none 

您的解決方案不起作用,因爲當你做value := default(value,"none"),在default功能僅適用於value列的right,即default(c("a","b"),"none")value列隨後更新爲加入前具有value的行的功能結果。另一個left行,在right中沒有任何相應的行,取而代之的是NA

對不起,不知道我的解釋很清楚......

+0

這是一個很好的解釋。非常感謝。 –

+0

如果我採用這種方法,那麼我正在製作一份數據副本,對嗎? –

+0

@NickAllen是的,如果是這樣的話,你的意思是在內存中你將同時擁有'左','右'和'右[...]'數據表。 – juba