Каков самый простой способ сделать левое внешнее соединение на двух таблицах данных (dt1, dt2), причем значение заливки равно 0 (или какое-либо другое значение) вместо NA (по умолчанию) без перезаписывания действительных значений NA в левых данных таблица?
Общим ответом, таким как этот поток, является выполнение левого внешнего соединения с помощью dplyr::left_join
или data.table::merge
или data.table
dt2 [dt1] синтаксис столбчатой колонки, а затем второй шаг, просто заменяющий все значения NA
на 0
в объединенной таблице данных. Например:
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;
Этот подход обязательно предполагает, что в dt1
нет действительных значений NA, которые необходимо сохранить. Тем не менее, как вы можете видеть в приведенном выше примере, результаты:
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
все элементы заменяют синтаксис, как указано выше, только значения NA в new_col
могут быть заменены:
library(dplyr);
merged_tables <- mutate(merged_tables, new_col = ifelse(is.na(new_col), 0, new_col));
Однако этот подход нецелесообразен для очень больших наборов данных, где сгруппированы десятки или сотни новых столбцов, иногда с динамически создаваемыми именами столбцов. Даже если имена столбцов были известны заранее, очень уродливо отобразить все новые столбцы и заменить их на мутате.
Должен быть лучший способ? Проблема будет просто решена, если синтаксис любого из скобок dplyr::left_join
, data.table::merge
или data.table
легко разрешил пользователю указывать значение fill
, отличное от NA. Что-то вроде:
merged_tables <- data.table::merge(dt1, dt2, by="x", all.x=TRUE, fill=0);
Функция data.table
dcast
позволяет пользователю указать значение fill
, поэтому я считаю, что должен быть более простой способ сделать это, о котором я просто не думаю.
Предложения?
EDIT: @jangorecki указала в комментариях, что на странице data.table
GitHug есть запрос функции, чтобы сделать точно что я только что упомянул, обновив синтаксис nomatch=0
. Должен быть в следующем выпуске data.table
.