對填充值爲0的兩個數據表(dt1,dt2)執行左外連接最簡單的方法是什麼?值)而不是NA(默認)而不覆蓋左側數據表中的有效NA值?R左外連接有0填充而不是NA,同時保留左表中的有效NA
一個常見的答案,如在this thread是做左外連接與任一dplyr::left_join
或或data.table
的DT2 [DT1]鍵控立柱支架的語法,接着簡單地通過0
在替換所有NA
值的第二步驟聯合數據表。例如:
library(data.table);
dt1 <- data.table(x=c('a', 'b', 'c', 'd', 'e'), y=c(NA, 'w', NA, 'y', 'z'));
dt2 <- data.table(x=c('a', 'b', 'c'), new_col=c(1,2,3));
setkey(dt1, x);
setkey(dt2, x);
merged_tables <- dt2[dt1];
merged_tables[is.na(merged_tables)] <- 0;
這種做法必然假定有一些需要保存沒有有效的NA值dt1
。然而,正如可以在上面的例子中看到的,結果是:
x new_col y
1: a 1 0
2: b 2 w
3: c 3 0
4: d 0 y
5: e 0 z
但所期望的結果是:
x new_col y
1: a 1 NA
2: b 2 w
3: c 3 NA
4: d 0 y
5: e 0 z
在這種簡單的情況,而不是使用data.table
所有元素替換語法如上,只是new_col
的NA值可以代替:
library(dplyr);
merged_tables <- mutate(merged_tables, new_col = ifelse(is.na(new_col), 0, new_col));
然而,這種方法不是非常大的數據集,其中數十或數百個實用的新列被合併,有時還會動態創建列名。即使列名都是事先知道的,但列出所有新列並且在每個列上進行mutate樣式替換是非常難看的。
必須有更好的方法嗎?如果dplyr::left_join
,或data.table
的括號中的任何一個的語法都容易允許用戶指定除NA之外的其他值fill
,則問題將簡單解決。喜歡的東西:
merged_tables <- data.table::merge(dt1, dt2, by="x", all.x=TRUE, fill=0);
data.table
的dcast
功能允許用戶指定fill
價值,所以我想一定有可以做到這一點,我只是沒有想到的一個更簡單的方法。
對此提出建議?
編輯:@jangorecki在評論中指出,目前data.table
GitHug page上正在打開的功能請求正是我剛纔提到的,更新了nomatch=0
語法。應該在data.table
的下一個版本中。
在你'merge'的端部,或使用外部聯接'[...,NOMATCH = NA]'鏈data.table查詢'合併()[is.na (col),col:= 0]'。有一個開放的FR,所以'nomatch' arg可以處理任意值,目前對於外連接它只能使用'NA'。 – jangorecki
我很抱歉,但我無法理解您的答案。 'col'從哪裏來?很高興聽到有一個開放的功能請求。我會爲其添加+1。 –
'col'只是一個正在進行連接的列 – jangorecki