R:高效的多列表查找

R:高效的多列表查找,r,filter,mapply,R,Filter,Mapply,我有两个数据帧,分别是R-TABLEA~6000行和TABLEB~30000行。所有列均为字符格式 表A:COL1-COL2-COL3-COL4 表B:COL1-COL2-COL3-COL4-COL5-COL6-COL7 我想通过为TABLEA中的每一行获取COL1-COL4的值,并对TABLEB中的相同列执行正则表达式匹配,向TABLEA添加第5列。然后,应将表B中COL5的值添加到表A中COL5处的相应行中 我已经编写了一个函数来实现这一点,并尝试了fop循环和mapply技术,但它需要很长

我有两个数据帧,分别是R-TABLEA~6000行和TABLEB~30000行。所有列均为字符格式

表A:COL1-COL2-COL3-COL4

表B:COL1-COL2-COL3-COL4-COL5-COL6-COL7

我想通过为TABLEA中的每一行获取COL1-COL4的值,并对TABLEB中的相同列执行正则表达式匹配,向TABLEA添加第5列。然后,应将表B中COL5的值添加到表A中COL5处的相应行中

我已经编写了一个函数来实现这一点,并尝试了fop循环和mapply技术,但它需要很长时间才能运行。我怀疑我执行查找的功能非常低效,必须有更好的方法来实现这一点

关于如何做到这一点,有什么有用的建议或提示吗

getValue<-function(input1, input2, input3, input4) 
{
  #filter TABLEB on 4 columns matching the 4 inputs above.
  FILTERED <- TABLEB %>% filter(str_detect(input1, COL1)) %>% filter(str_detect(input2, COL2)) %>%  
    filter(str_detect(input3, COL3)) %>% filter(str_detect(input4, COL4)) %>% 
    #select the 1st value from column 5, in case of multiple matches
    select(COL5) %>%  head(1)

  VALUE<-as.character(FILTERED$COL5)

  #if no match found
  if(length(VALUE) == 0) VALUE = "UNKNOWN"

  return(VALUE)
}

#for-loop method
for(i in 1:nrow(TABLEA)) {
  TABLEA[i, ]$COL5<-getValue(TABLEA[i, ]$COL1, TABLEA[i, ]$COL2, TABLEA[i, ]$COL3, TABLEA[i, ]$COL4)  

#mapply method
TABLEA$COL5<-mapply(getValue, TABLEA$COL1, TABLEA$COL2, TABLEA$COL3, TABLEA$COL4)
}


请考虑一个小的可重复的例子,你应该提供一个包括错误的如果有的话。你的问题应该清楚具体。取下并读取librarydata.table;setDTTABLEA[setDTTABLEB,COL5:=i.COL5,on=cCOL1=COL1,COL2=COL2,COL3=COL3,COL4=COL4]您可以。使用名称如果您遵循我共享的链接,并提供一个示例,我将发布一个解决您具体问题的答案。但使用@akrun建议的名称是一种方法。