R:在两个向量中计算相似的数字

时间:2014-11-15 17:53:42

标签: r function

  shared_numbers<- function(x, y){
  shared_numbers=0
  for(r in 1:5) {
    for(c in 1:5) {
      if (x[c]==result[r]){shared_numbers = shared_numbers+1}  
    }
  }
  return(shared_numbers)
}

#Example
shared_numbers(c(12, 17, 37, 58, 81, 89),  c(4, 19, 37, 81, 87, 19))
[1] 2

问题是当我需要使用它时,这个功能非常慢。 我认为这是因为循环,但我不知道如何避免它们。

问题:如何优化此功能? 谢谢理查德,总和(结果%in%组合)效果非常好。

问题2:如何在不使用for循环的情况下将此shared_number函数应用于数千个组合?

2 个答案:

答案 0 :(得分:1)

您可以使用%in%

摆脱循环
result <- c(12, 17, 37, 58, 81, 89)
combo <- c(4, 19, 37, 81, 87, 19)
sum(result %in% combo)
# [1] 2

你可以用

复制这个,比如十二次
set.seed(25)
repCombo <- replicate(12, sample(90, 6), simplify = FALSE)
vapply(repCombo, function(x) sum(result %in% x), 1L)
# [1] 0 1 0 0 0 0 0 0 2 1 0 1

关于您对不同数据结构的评论,这将起作用

lottoSum <- function(result, combo) 
{
    f <- function(x, y) sum(x %in% y)
    if (is.matrix(combo)) {
        apply(combo, 2, f, x = result)
    } else if (is.vector(combo) && is.atomic(combo)) {
        f(result, combo)
    } else {
        vapply(combo, f, x = result, 1L, USE.NAMES = FALSE)
    }
}

lottoSum(result, as.data.frame(repCombo))      ## data frame
# [1] 0 1 0 0 0 0 0 0 2 1 0 1
lottoSum(result, repCombo)                     ## list
# [1] 0 1 0 0 0 0 0 0 2 1 0 1
lottoSum(result, combo)                        ## vector
# [1] 2
lottoSum(result, matrix(unlist(repCombo), 6))  ## matrix
# [1] 0 1 0 0 0 0 0 0 2 1 0 1

答案 1 :(得分:1)

只需使用&#39; cross&#39;功能:

> length(intersect(c(12, 17, 37, 58, 81, 89)
+         ,  c(4, 19, 37, 81, 87, 19)
+         )
+     )
[1] 2
>