4

我有两个长的名字向量(list.1list.2)。我想运行一个循环来检查 list.2 中的任何名称是否与 list.1 中的任何名称匹配。如果是这样,我想将匹配名称在向量 list.1 中的位置值附加到向量结果中。

 for (i in list.2){
  for (j in list.1){
    if(length(grep(list.2[i], list.1[j]), ignore.case=TRUE)==0){
      append(result, j)
      break
    } else append(nameComment.corresponding, 0)
  }
}

上面的代码真的很暴力,因为我的向量有 5,000 和 60,000 个名字长,它可能会运行超过 360,000,000 次循环。我该如何改进它?

4

2 回答 2

3

which并且%in%可能对这项任务有好处,或者match取决于你的目标。需要注意的一点是,它在第​​二个参数中match返回第一个参数的第一个匹配项的索引(也就是说,如果您在查找表中有多个值,则只会返回第一个匹配项):

set.seed(123)
#  I am assuming these are the values you want to check if they are in the lookup 'table'
list2 <- sample( letters[1:10] , 10 , repl = T )
[1] "c" "h" "e" "i" "j" "a" "f" "i" "f" "e"

#  I am assuming this is the lookup table
list1 <- letters[1:3]
[1] "a" "b" "c"

#  Find which position in the lookup table each value is, NA if no match
match(list2 , list1 )
[1]  3 NA NA NA NA  1 NA NA NA NA
于 2013-08-10T07:31:26.580 回答
1

这完全是集合操作intersect/union/setdiff()的用途:

list.1 = c('Alan','Bill','Ted','Alice','Carol')
list.2 = c('Carol','Ted')
intersect(list.1, list.2)
 "Ted" "Carol"

...或者,如果您真的希望将索引放入 list.1:

match(intersect(list.1, list.2), list.1)
  3 5
于 2018-05-04T05:32:58.143 回答