1

我正在努力解决这个问题,但对我的解决方案不是很满意。在较大的文件上效率不是很高。

我有两个数字列表:

a <- as.numeric(c("12345678","2235689","56980"))
b <- as.numeric(c("123","1234","223","2235689","111","222","555","888","12345","8989"))

我需要知道是否有任何来自 START 的数字与 b 中的任何数字。

所以我写了一个函数如下:

findpattern <- function(a,b){
  a_s<-c()
  b_s<-c()
  for (a1 in a){
    z<-sapply(b,function(x)(1 %in% (regexpr(x,a1))))
    if (TRUE %in% unique(z)){
      b1 <- b[z]
      a_s<- c(a_s,a1)
      b_s<- c(b_s,pplist(b1))
    }
  }
  res <- data.frame(a_find=a_s,b_associate=b_s)
  return (res)
}

所以结果应该是这样的:

> findpattern(a,b)
   a_find    b_associate
1 12345678 123,1234,12345
2  2235689    223,2235689

但我对我的解决方案不满意,因为当 b 文件带有超过 10k 的数字时,它需要相当长的时间才能完成......有没有更好的解决方案?

非常感谢!!!!

4

1 回答 1

4

也许你想要这样的东西?

result <- sapply(paste0('^', b), grepl, x=a)
rownames(result) <- a
#           ^123 ^1234  ^223 ^2235689  ^111  ^222  ^555  ^888 ^12345 ^8989
# 12345678  TRUE  TRUE FALSE    FALSE FALSE FALSE FALSE FALSE   TRUE FALSE
# 2235689  FALSE FALSE  TRUE     TRUE FALSE FALSE FALSE FALSE  FALSE FALSE
# 56980    FALSE FALSE FALSE    FALSE FALSE FALSE FALSE FALSE  FALSE FALSE

要以类似于您的示例结果的格式获取此信息:

result.l <- apply(result, 1, function(row) b[row])
# $`12345678`
# [1]   123  1234 12345
# 
# $`2235689`
# [1]     223 2235689
# 
# $`56980`
# numeric(0)

我建议在问题中显示的格式上使用它,这是非标准的。

或者这个,看起来像你想要的结果,但有一个标准的结构。

stack(lapply(result.l, paste, collapse=','))
#           values      ind
# 1 123,1234,12345 12345678
# 2    223,2235689  2235689
# 3                   56980
于 2013-11-06T20:16:34.923 回答