我刚刚从1到39生成了10个随机乐透号码,现在我想检查这些号码是否与我的中奖票证相匹配,例如w<-c(2,8,19,23,25,32,37)
,这样如果我在特定组合中有3场比赛,奖金为10 $ 4 50 $ 5 100 $ $ 6 $ 2000 $和所有7 100000 $。
set.seed(99)
y <- replicate(10,sample(1:39,7,replace=FALSE))
dimnames(y) <- list(rownames(y,do.NULL=FALSE,prefix=""),
colnames(y,do.NULL=FALSE,prefix="Combination"))
m <- t(y)
(m2 <- t(apply(m,1,sort)))
[,1] [,2] [,3] [,4] [,5] [,6] [,7]
Combination1 5 19 23 26 33 36 39
Combination2 7 12 14 18 20 22 37
Combination3 4 7 8 14 25 27 36
Combination4 1 4 13 22 27 28 32
Combination5 1 2 8 12 13 19 37
Combination6 16 18 22 27 30 31 35
Combination7 13 15 18 20 31 34 36
Combination8 5 10 27 28 29 31 35
Combination9 4 10 14 21 23 33 35
Combination10 1 17 20 28 29 32 33
答案 0 :(得分:4)
收到的答案都是正确的。我只是指出%in%
和is.element
基本上是相同的功能。但是,不需要任何apply
。请记住,apply
只隐藏for
循环,与矢量化内部R函数相比非常慢。我只是建议:
rowSums(matrix(m %in% w, ncol=ncol(m)))
可以更快:
m<-t(replicate(100000,sample(39,7)))
system.time(res<-apply(m,1,function(x) sum(x%in%w)))
# user system elapsed
# 0.584 0.000 0.587
system.time(res2<-rowSums(matrix(m %in% w, ncol=ncol(m))))
# user system elapsed
# 0.036 0.004 0.040
all.equal(res,res2)
#[1] TRUE
答案 1 :(得分:2)
您应该使用is.element
功能。 is.element为w
的每个元素提供一个布尔值,告诉该元素是否属于m2[1,]
的一部分。然后你可以将is.element
给出的布尔值向量相加。此总和可为您提供所需内容:属于w
的{{1}}元素数。
m2[1,]
当您在sum( is.element(w,m2[1,]) )
的每一行上重复操作时,m2
函数必须与for循环或is.element
函数组合。
apply
PS :它也适用于colSums(apply(m2, 1, is.element, el=w))
和m
:y
和colSums(apply(m, 1, is.element, el=w))
答案 2 :(得分:1)
您可以使用%in%
获取匹配的逻辑向量并对此求和。
apply(m2,1,function(x) sum(x%in%w))
Combination1 Combination2 Combination3 Combination4 Combination5
2 1 2 1 4
Combination6 Combination7 Combination8 Combination9 Combination10
0 0 0 1 1
奖金额:
c("0$","0$","0$","10$","50$","100$","2000$","100000$")[apply(m2,1,function(x) sum(x%in%w))+1]
[1] "0$" "0$" "0$" "0$" "50$" "0$" "0$" "0$" "0$" "0$"
尚未退休。