Función de lotería con R
Frecuentes
Visto 2,437 equipos
3
Acabo de generar 10 números de lotería aleatorios del 1 al 39, ahora quiero verificar si estos números coinciden con mi boleto ganador, por ejemplo. w<-c(2,8,19,23,25,32,37)
por lo que si tengo 3 cerillas en combinación particular el premio es 10$ por 4 50$ por 5 100$ por 6 2000$ y por todo 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
3 Respuestas
5
Las respuestas recibidas son ambas correctas. Solo señalaría que %in%
y is.element
son básicamente la misma función. Sin embargo, no hay necesidad de ningún apply
. Manten eso en mente apply
solo esconde un for
bucle y es muy lento en comparación con las funciones R internas vectorizadas. Solo sugeriría:
rowSums(matrix(m %in% w, ncol=ncol(m)))
que puede ser mucho más rápido:
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
Respondido 07 Oct 14, 14:10
2
Se debe utilizar la is.element
función. is.element te da para cada elemento de w
un booleano que dice si este elemento es parte de m2[1,]
. Entonces puedes sumar el vector de booleanos dado por is.element
. Esta suma te da lo que estás buscando: el número de elementos de w
que pertenecen a m2[1,]
.
sum( is.element(w,m2[1,]) )
A medida que repite la acción en cada fila de m2
, la is.element
La función debe combinarse con un bucle for o con el apply
función.
colSums(apply(m2, 1, is.element, el=w))
PS: también sirve para m
y y
: colSums(apply(m, 1, is.element, el=w))
y colSums(apply(y, 2, is.element, el=w))
Respondido 07 Oct 14, 14:10
1
Puedes usar %in%
para obtener un vector lógico de las coincidencias y sumar esto.
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
Y por los importes de los premios:
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$"
No te jubiles todavía.
Respondido 07 Oct 14, 14:10
No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas r simulation or haz tu propia pregunta.