避免 运行 循环时间

Avoid run time in looping

Test 是我想要提取值的数据库,即 emp id 向量,我有另一个名为 User 的文件,我想从中提取值。

测试数据库

名称 Emp ID
A
B
C
D
一个

用户档案

名称 Emp ID
一个 1
B 2
C 3
D 4
一个 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]}}

我需要知道一个更短的方法,比如应用函数。我想要数据框中的结果,而不是矩阵或列表。

如果我正确理解你的问题,你可以简单地合并这两个数据集。但是,在合并之前,我们 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

更新

根据评论中的信息,我们需要考虑 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 然后明确声明只保留 NameEmp_ID。最后,我们将 all.x = TRUE 传递给 merge 函数,以确保不会删除 user 中未找到的 test 中的任何值。

为了解决最后一个问题,如果 testuser 不共享 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