避免 运行 循环时间
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
然后明确声明只保留 Name
和 Emp_ID
。最后,我们将 all.x = TRUE
传递给 merge
函数,以确保不会删除 user
中未找到的 test
中的任何值。
为了解决最后一个问题,如果 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
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
然后明确声明只保留 Name
和 Emp_ID
。最后,我们将 all.x = TRUE
传递给 merge
函数,以确保不会删除 user
中未找到的 test
中的任何值。
为了解决最后一个问题,如果 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