2

StackOverflow の最初の投稿なので、エチケットが正しくない場合は優しくしてください。

カードのデッキから引き出された手を含む大きなデータ フレーム (実際には 7 つですが、それは重要ではありません) があります。それに対応する別の配列があり、プレイヤーが最初の手札からどのカードを保持することを選択したかを示します。保持されなかったカードは、デッキから再ドローされます。最初のデータ フレームには、描かれたすべてのカードが保持されるため、5 から 0 の間に保持されたカードの場合、各行は 5 から 10 列の長さにすることができます。それは理にかなっていますか? 例えば:

> str(cards01)
'data.frame':   5044033 obs. of  10 variables

> head(cards01)
   V1  V2  V3  V4  V5  V6  V7 V8  structure(c("", "", "", "", "", ""), class = "AsIs")
1  D0 D10  H0  C5  H1  S3  C4 D6                                                      
2  D5 S10  H7  C7  S0  S5 S12 H5                                                      
3  S4  H4  C1  D4 D11  H6  D1                                                         
4  C3  C9  D9 S10  S2  C7  S3 D2                                                      
5 H11  C0  C6  H3 H12 C11  S0                                                         
6 C10  C9 D11  D8  D5  S8

> str(heldCards01)
 num [1:5044033, 1:5] 1 3 1 2 1 1 2 1 1 1 ...
 - attr(*, "dimnames")=List of 2
  ..$ : NULL
  ..$ ..$ : chr [1:5] "1" "2" "3" "4" ...

> head(heldCards01)
     1 2  3  4  5
[1,] 1 3 NA NA NA
[2,] 3 4 NA NA NA
[3,] 1 2  4 NA NA
[4,] 2 3 NA NA NA
[5,] 1 4  5 NA NA
[6,] 1 2  3  4 NA

だから私がやっていることは、プレイヤーが最終的に持つカードだけを含む新しいデータフレームを作成することです。つまり、保持されたカード配列で識別されない各行のセルを削除します。これを実行するコードを書きましたが、現在は週末中ずっと実行されていますが、まだ完了していません。これは私が実行しているコードです (これはすべて、私が持っている各データフレーム/マトリックスのペアを通過するためにラップリーで発生しています。最適化しようとしているビットは mclapply で発生しています):

all.hands <- lapply(stakes, function(stake){
  cardsOb <- get(paste("cards", stake, sep = ""))
  heldOb <- get(paste("heldCards", stake, sep = ""))
  l <- length(cardsOb[,1])
  mclapply(1:l, function(rowNum) {
    row <- (heldOb[rowNum,])
    theNAs <- as.logical(is.na(row))
    heldIndex <- row[!theNAs]
    discarded <- c(1,2,3,4,5)[-heldIndex]
    if(length(discarded) >= 1) {
      hand <- cardsOb[rowNum,-discarded]
    } else {
      hand <- cardsOb[rowNum,]
    }
    hand <- sort(hand)
  })
})

いくつかのステップを切り取る可能性のある欠けている機能はありますか? データ フレームが配列の場合は高速になりますか? 何日も何日も待たなければなりませんか?2 つの Xeon E5-2407 クアッド コア プロセッサと 32GB メモリを搭載した Z620 で実行しています。

4

1 に答える 1

0

これが私がそれを行う方法です。簡単にするために、最初のカードの保持はデータフレーム df1 にあり、保持カードのインデックスは df2 にあると仮定します (名前を変更しただけです)。

アイデアは、df2 の行を df1 の行に一致するインデックスとして使用し、すべての行に対して繰り返すことです。クラスの問題を回避するために、data.frames ではなく配列を使用します (インデックスとしてはあまり適していません)。

これは、1 つの「オタク」コマンドで実行できます。

holdings = t(sapply(1:nrow(df1),function(x) as.matrix(df1)[x,][as.matrix(df2)[x,]]))

その後、行名と列名を変更したり、新しい data.frame を作成したりできます。

おそらくもっと良い方法がありますが、上記は非常に簡単だと思います。そのコマンドで何かわからないことがあれば気軽に質問してください

于 2013-06-24T11:57:32.397 に答える