乐透功能与R

时间:2014-10-07 13:10:17

标签: r simulation

我刚刚从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

3 个答案:

答案 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)) mycolSums(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$"

尚未退休。