На самом деле нам вообще не нужно merge
, вам нужно выбрать первый доступный вариант для Number
, начиная с Data1
, затем Data3
, и я полагаю, что при Name
возвращается NA. находится в Data2
, а не в других.
Самый быстрый способ сделать это с помощью data.table
, но я дам и другие варианты.
data.table
data.table::rbindlist
по умолчанию не использует имена (use.names=FALSE
), поэтому в этом случае это очень удобно.
library(data.table)
rbindlist(list(Data1,Data3,Data2))[,.SD[1,],by="Name_description"]
# 1: ABC 23
# 2: DEF 34
# 3: GHI 45
# 4: XYZ 43
# 5: JVK 23
# 6: LMN 21
# 7: PQR 100
# 8: KJL 85
Тидиверс решение
аргумент .keep_all
dplyr::distinct
полезен, чтобы избежать менее читабельного использования %>% filter(!duplicated(Names))
или %>% group_by(Names) %>% Slice(1)
.
library(tidyverse)
lst(Data1,Data3,cbind(Data2,NA)) %>%
map(setNames,c("Names","Numbers")) %>%
bind_rows %>%
distinct(Names,.keep_all = TRUE)
# Names Numbers
# 1 ABC 23
# 2 DEF 34
# 3 GHI 45
# 4 XYZ 43
# 5 JVK 23
# 6 LMN 21
# 7 PQR 100
# 8 KJL 85
базовый раствор
x <- do.call(rbind,lapply(list(Data1,Data3,cbind(Data2,NA)),setNames,c("Names","Numbers")))
x[!duplicated(x[[1]]),]
# Names Numbers
# 1 ABC 23
# 2 DEF 34
# 3 GHI 45
# 4 XYZ 43
# 5 JVK 23
# 6 LMN 21
# 13 PQR 100
# 14 KJL 85