Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 避免循环中的运行时_R_Loops_Apply - Fatal编程技术网

R 避免循环中的运行时

R 避免循环中的运行时,r,loops,apply,R,Loops,Apply,Test是我的数据库,我想从中提取值,即emp id vector,我还有一个名为User的文件,我想从中提取值 测试数据库 名称Emp ID A B C D A 用户文件 名称Emp ID A 1 B 2 C3 D 4 A 1 我的循环中有两个条件。我找到匹配的值,然后只选择它,如果有重复项,我只选择一个。我用了这个环。需要3个小时。我的用户文件中有dataframe和300000多行,我希望从中获取值 for (i in 1:nrow(Test)) {`enter code here` if

Test是我的数据库,我想从中提取值,即emp id vector,我还有一个名为User的文件,我想从中提取值

测试数据库

名称Emp ID
A
B
C
D
A

用户文件

名称Emp ID
A 1
B 2
C3
D 4
A 1

我的循环中有两个条件。我找到匹配的值,然后只选择它,如果有重复项,我只选择一个。我用了这个环。需要3个小时。我的用户文件中有dataframe和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]}}
for(i在1:nrow(测试))
{`在这里输入代码`
if(在%User\u Name中测试[i,“Name”]%
{

如果我正确理解您的问题,您可以简单地合并这两个数据集。但是,在合并之前,我们1)从
test
中删除
Emp\u id
变量,2)dedup
user
。这种方法假设
Emp\u id
对于所有具有相同
名称的行都是相同的

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
我们使用
subset
来去除
test
中的
Emp\u ID
变量,因为我们要合并它。我们使用
!duplicated
来重复
用户
,然后特别声明只保留
名称
Emp\u ID
。最后,我们将
全部.x=TRUE
传递给
合并
f函数以确保不会删除
用户中未找到的
测试中的任何值

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

名称(用户)我不认为这是我一直在寻找的。假设测试有另一个元素E,而status没有该元素,那么它不会返回NA,而是在测试中返回D。同样,如果假设用户有一个Column,我不想与测试合并。我如何删除这个函数本身。status是什么?这是
tes中的一个变量吗t
?这是您所调用的
user
的实际名称吗?如果您只想从
user
获取
Emp\u ID
,那么只需在merge语句中声明即可。
x让我们说,如果test有另一个元素E,而user没有该元素,那么它在test中不会返回NA,而是返回D。同样,如果让我们说用户有一个Column,我不想与test合并。我如何在这个函数中删除它。在上面的函数中,如果让我们假设用户和test对同一个向量有不同的标签。就像在user中,它是Name,在test中,它是Name,那么你发布的这个函数可以工作吗?或者我必须使用by.x=Name和by.y=NameI来合并它'将编辑我的答案以考虑新的条件。
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