避免循环中的运行时间

时间:2016-01-19 11:45:04

标签: r loops apply

测试是我的数据库,我想拉取值,即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]}}

我需要知道像应用函数这样的更短的方法。我希望结果在数据框中而不是矩阵或列表。

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,然后明确指出仅保留NameEmp_ID。最后,我们将all.x = TRUE传递给merge函数,以确保test中找不到的user中的任何值都不会被删除。

要解决最后一个问题,即如果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