Función de lotería con R

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

preguntado Oct 07 '14, 14:10

3 Respuestas

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

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

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 or haz tu propia pregunta.