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函数应用于数千个组合?
答案 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
>