如果我正确理解您的问题,您可以简单地合并这两个数据集。但是,在合并之前,我们 1) 从 test 中删除 Emp_ID 变量,以及 2) 删除 user。此方法假定Emp_ID 对于具有相同Name 的所有行都是相同的。
x <- merge(test[, 1], user[!duplicated(user$Name), ], by = "Name")
x
Name Emp_Id
1 A 1
2 B 2
3 C 3
4 D 4
更新
根据 cmets 中的信息,我们需要考虑 a) test$Name 中的值在 user$Name 中不存在,以及 b) 从 user 中删除我们不想要的变量。这仍然可以通过merge 完成,我们只需要添加一些新选项即可。
test <- data.frame(Name = c(LETTERS[1:6], "A", "E"), Emp_ID = NA, stringsAsFactors = FALSE)
user <- data.frame(Name = c(LETTERS[1:4], "A"), Emp_ID = c(1:4, 1))
x <- merge(subset(test, select = -c(Emp_ID)), user[!duplicated(user$Name), c("Name", "Emp_ID")], by = "Name", all.x = TRUE)
x
# Name Emp_ID
# 1 A 1
# 2 A 1
# 3 B 2
# 4 C 3
# 5 D 4
# 6 E NA
# 7 E NA
# 8 F NA
我们使用subset 删除test 中的Emp_ID 变量,因为我们将要合并它。我们使用!duplicated 对user 进行去重,然后明确声明只保留Name 和Emp_ID。最后,我们将all.x = TRUE 传递给merge 函数,以确保test 中没有在user 中找到的任何值都不会被删除。
为了解决最后一个问题,即如果test 和user 不共享Name 的相同变量,则合并,我们只需稍微调整merge 函数。
names(user) <- c("Emp_Name", "Emp_ID")
x <- merge(subset(test, select = -c(Emp_ID)), user[!duplicated(user$Emp_Name), c("Emp_Name", "Emp_ID")], by.x = "Name", by.y = "Emp_Name", all.x = TRUE)
x
# Name Emp_ID
# 1 A 1
# 2 A 1
# 3 B 2
# 4 C 3
# 5 D 4
# 6 E NA
# 7 E NA
# 8 F NA