测试是我的数据库,我想拉取值,即emp id vector,我有另一个名为User的文件,我想从中提取值。
测试数据库
姓名Emp ID
一个
乙
ç
d
一个
用户文件
姓名Emp ID
A 1
B 2
C 3
D 4
A 1
我的循环中有两个条件。我找到匹配的值然后我才选择它,如果有重复,我只选择一个。我用过这个循环。这需要3个小时。我在我的用户文件中有数据框和300000多行,我想要值。
for (i in 1:nrow(Test))
{`enter code here`
if(Test[i,"Name"] %in% User_Name)
{
item_id_found<-Test[i,"Name"]Test[i,"Emp_ID"]<-as.numeric(User[which(User$Name==item_id_found),"Emp_ID"])[1]}}
我需要知道像应用函数这样的更短的方法。我希望结果在数据框中而不是矩阵或列表。
答案 0 :(得分:0)
如果我正确理解您的问题,您可以简单地合并两个数据集。但是,在我们合并之前,我们1)从Emp_ID
删除test
变量,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
根据评论中的信息,我们需要考虑a)test$Name
中不存在的user$Name
中的值,以及b)从user
中删除我们不知道的变量&# 39;不要。这仍然可以通过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
删除Emp_ID
中的test
变量,因为我们将要合并它。我们使用!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