Cara mengidentifikasi pasangan apa pun dengan dua nilai bingkai data

Saya memiliki latihan dengan R di mana saya harus bekerja dengan kerangka data lotre, dengan setiap undian di La Primitiva dari tahun 1985 hingga 2011. Sekilas (kisaran angkanya dari 1 hingga 49). Ini adalah angka untuk kombinasi pemenang:

n1 n2 n3 n4 n5 n6
01 19 20 23 34 39
05 11 22 32 38 48
.................
i1<i2<i3<i4<i5<i6

Dalam salah satu poin latihan, saya mempunyai pertanyaan berikut, terkait dengan data lotre:

Untuk setiap pasangan (i, j), dengan i, j ∈ {1,...,49}, i ‹ j, lakukan hal berikut:

Identifikasi mij undian yang kedua angkanya berada dalam kombinasi pemenang.

Saya telah membuat matriks karena alternatif lain, dengan combn, menghasilkan kerangka data dengan 1.176 baris dan dua kolom, sesuatu yang kikuk.

pairs <- matrix(0, nrow=49, ncol=49)

Matriks tersebut mempunyai 49 baris dan 49 kolom. Sekarang saya perlu mengidentifikasi pasangan ([i,],[,j]) di dalam kerangka data (pada prinsipnya, saya mencari apakah ada pasangan angka -kami memiliki 1.176 kombinasi- yang cocok dengan dua angka kombinasi pemenang yang saya tunjukkan sebelumnya), dengan ketentuan sebagai berikut: [i,] ‹ [,j]. Terakhir, itu berarti matriks berikut: http://i.stack.imgur.com/7CBbl.png

Beberapa cara efisien untuk melakukan itu di R? Saya memahami beberapa ide, tetapi itu tidak mungkin terwujud pada waktunya.

Terima kasih. Dan maaf untuk bahasa Inggris saya yang kikuk.


person Daniel Robledo    schedule 20.07.2015    source sumber
comment
Saya bingung dengan bahasa dalam pertanyaan mengidentifikasi undian m_ij. Apakah ini berarti Anda ingin menghitung jumlah undian yang dimiliki setiap pasangan, atau Anda ingin mempertahankan nomor baris data lotre asli tempat setiap pasangan muncul?   -  person Gregor Thomas    schedule 20.07.2015
comment
Anda mengatakan bahwa combn memberikan data.frame, tetapi selalu mengembalikan matriks ketika saya menggunakannya...   -  person Frank    schedule 20.07.2015
comment
Apakah ini berarti Anda ingin menghitung jumlah seri yang dimiliki setiap pasangan. Ini, terima kasih.   -  person Daniel Robledo    schedule 20.07.2015
comment
Frank, itu benar. Saya lupa menyebutkan fakta bahwa saya mengubah keluaran asli dari combn dalam kerangka data.   -  person Daniel Robledo    schedule 20.07.2015


Jawaban (2)


Berikut solusi menggunakan Rcpp, yang ditunjukkan pada data pengujian yang dihasilkan secara acak:

library('Rcpp');
set.seed(1); N <- 2704; winners <- setNames(as.data.frame(t(replicate(N,sort(sample(1:49,6))))),paste0('n',1:6));
head(winners);
##   n1 n2 n3 n4 n5 n6
## 1 10 14 18 27 40 42
## 2  3  8 10 30 32 47
## 3 19 23 33 34 37 44
## 4  6 10 19 30 38 44
## 5  1 14 15 18 19 40
## 6  9 24 29 30 38 49
cppFunction('
    IntegerMatrix laprim2(DataFrame winners) {
        IntegerMatrix counts(49,49);
        size_t nr = winners.nrows();
        IntegerVector n1 = winners[0], n2 = winners[1], n3 = winners[2], n4 = winners[3], n5 = winners[4], n6 = winners[5];
        for (size_t i = 1; i < 49; ++i)
            for (size_t j = i+1; j <= 49; ++j)
                for (size_t r = 0; r < nr; ++r)
                    if (
                        (n1(r) == i || n2(r) == i || n3(r) == i || n4(r) == i || n5(r) == i || n6(r) == i)
                        && (n1(r) == j || n2(r) == j || n3(r) == j || n4(r) == j || n5(r) == j || n6(r) == j)
                    ) ++counts(i-1,j-1);
        return counts;
    }
');
laprim2(winners);
##       [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13] [,14] [,15] [,16] [,17] [,18] [,19] [,20] [,21] [,22] [,23] [,24] [,25] [,26] [,27] [,28] [,29] [,30] [,31] [,32] [,33] [,34] [,35] [,36] [,37] [,38] [,39] [,40] [,41] [,42] [,43] [,44] [,45] [,46] [,47] [,48] [,49]
##  [1,]    0   46   31   44   49   31   31   56   25    28    37    39    34    37    36    35    36    25    37    31    40    34    46    44    31    32    36    32    43    31    24    36    43    40    32    36    38    32    40    31    31    41    43    35    31    34    45    23    38
##  [2,]    0    0   30   31   51   31   23   29   16    36    37    40    34    29    33    41    35    37    27    40    37    34    39    39    40    30    31    32    36    28    28    36    31    26    36    27    34    38    39    32    30    36    34    33    38    46    43    28    43
##  [3,]    0    0    0   31   37   25   26   37   20    34    29    39    33    29    38    38    43    22    33    31    32    37    34    35    36    45    35    25    21    28    39    28    28    44    45    23    43    32    34    34    32    42    40    33    31    33    44    29    32
##  [4,]    0    0    0    0   34   46   36   35   44    44    35    40    49    42    27    24    33    31    37    40    37    39    37    48    30    36    34    30    37    26    37    35    38    36    38    29    39    29    31    27    28    34    28    39    29    31    55    29    41
##  [5,]    0    0    0    0    0   31   26   44   27    34    40    34    27    40    38    33    30    22    29    31    30    40    43    37    34    37    31    34    32    26    35    32    44    32    39    28    32    30    44    33    39    35    50    29    39    42    49    41    31
##  [6,]    0    0    0    0    0    0   32   26   35    30    34    40    38    37    30    42    31    35    43    37    26    37    32    34    32    26    23    41    32    38    34    34    36    32    46    32    38    38    36    32    40    28    42    34    36    42    42    27    41
##  [7,]    0    0    0    0    0    0    0   36   29    37    34    32    30    32    28    39    31    35    35    33    26    48    28    31    34    28    41    33    36    27    37    36    33    33    29    25    31    24    32    41    27    30    30    27    37    40    39    22    35
##  [8,]    0    0    0    0    0    0    0    0   32    41    42    25    25    33    40    32    42    26    34    23    38    42    39    45    27    36    33    41    41    31    26    35    44    31    36    36    35    28    36    35    32    31    32    44    26    33    45    44    25
##  [9,]    0    0    0    0    0    0    0    0    0    29    29    32    46    37    30    31    31    32    37    34    31    28    37    43    29    28    30    30    21    29    36    30    28    23    31    32    30    39    29    34    27    34    30    36    23    24    30    24    38
## [10,]    0    0    0    0    0    0    0    0    0     0    40    31    34    27    35    33    34    31    34    25    30    25    31    38    37    39    33    23    24    24    36    33    30    31    33    28    28    26    23    34    34    39    33    38    37    32    38    29    42
## [11,]    0    0    0    0    0    0    0    0    0     0     0    42    41    28    40    46    49    33    39    29    35    39    26    35    41    33    29    33    36    24    40    37    28    34    33    25    38    32    41    45    33    38    43    31    31    42    43    40    31
## [12,]    0    0    0    0    0    0    0    0    0     0     0     0    38    29    35    35    41    34    37    40    34    47    43    42    33    34    31    33    34    33    36    47    36    32    39    32    22    43    36    30    32    35    39    37    41    41    43    31    41
## [13,]    0    0    0    0    0    0    0    0    0     0     0     0     0    34    37    46    43    26    29    33    36    39    35    44    41    39    35    24    38    43    30    42    30    44    37    40    32    29    36    37    25    36    43    42    43    47    33    32    36
## [14,]    0    0    0    0    0    0    0    0    0     0     0     0     0     0    30    28    35    36    28    37    35    45    38    33    35    31    39    39    35    25    40    32    30    42    35    36    40    31    32    34    28    35    38    38    30    27    45    34    30
## [15,]    0    0    0    0    0    0    0    0    0     0     0     0     0     0     0    24    37    43    48    30    42    40    28    31    30    37    38    32    28    39    30    34    32    41    44    34    36    34    31    30    22    38    47    42    37    39    35    33    32
## [16,]    0    0    0    0    0    0    0    0    0     0     0     0     0     0     0     0    32    26    34    34    31    46    29    37    33    34    29    39    32    33    30    36    35    19    43    28    29    32    39    39    28    40    38    38    35    39    41    26    34
## [17,]    0    0    0    0    0    0    0    0    0     0     0     0     0     0     0     0     0    39    43    43    36    40    29    38    45    52    25    37    35    37    29    36    47    49    35    33    30    33    43    44    41    32    33    41    36    47    50    37    42
## [18,]    0    0    0    0    0    0    0    0    0     0     0     0     0     0     0     0     0     0    38    34    28    42    39    37    37    31    33    29    39    31    33    32    27    33    27    34    34    37    36    34    26    35    34    33    40    43    34    23    29
## [19,]    0    0    0    0    0    0    0    0    0     0     0     0     0     0     0     0     0     0     0    28    26    31    34    35    37    36    32    31    35    33    33    28    37    32    42    25    32    33    38    40    30    35    38    38    38    38    41    25    47
## [20,]    0    0    0    0    0    0    0    0    0     0     0     0     0     0     0     0     0     0     0     0    23    34    43    30    33    53    30    38    34    34    35    45    28    42    37    27    34    31    35    33    32    28    39    39    45    41    39    24    41
## [21,]    0    0    0    0    0    0    0    0    0     0     0     0     0     0     0     0     0     0     0     0     0    27    32    36    33    30    39    31    23    35    29    33    43    40    31    28    43    25    34    30    26    40    46    41    29    32    38    27    31
## [22,]    0    0    0    0    0    0    0    0    0     0     0     0     0     0     0     0     0     0     0     0     0     0    32    36    38    35    33    40    42    40    38    37    34    46    36    30    29    32    35    28    26    27    40    36    33    44    37    30    37
## [23,]    0    0    0    0    0    0    0    0    0     0     0     0     0     0     0     0     0     0     0     0     0     0     0    49    27    41    20    29    37    42    35    39    34    34    37    32    35    29    40    31    29    41    29    47    36    37    37    27    42
## [24,]    0    0    0    0    0    0    0    0    0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0    30    36    22    28    35    40    39    38    43    31    34    39    46    40    35    29    35    44    27    38    38    38    38    24    36
## [25,]    0    0    0    0    0    0    0    0    0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0    31    36    33    28    26    44    36    28    26    38    28    26    32    31    37    27    31    52    34    33    33    31    30    36
## [26,]    0    0    0    0    0    0    0    0    0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0    37    35    27    28    36    34    24    32    40    28    28    34    40    33    26    30    48    31    41    40    43    37    33
## [27,]    0    0    0    0    0    0    0    0    0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0    31    28    28    32    31    36    26    25    24    27    29    42    26    30    32    35    39    44    33    31    24    37
## [28,]    0    0    0    0    0    0    0    0    0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0    36    26    32    38    33    23    28    36    32    20    36    32    27    28    36    37    31    33    43    33    22
## [29,]    0    0    0    0    0    0    0    0    0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0    26    29    37    34    37    28    31    30    25    34    31    29    32    30    37    30    41    32    30    37
## [30,]    0    0    0    0    0    0    0    0    0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0    31    37    31    33    29    25    34    25    37    24    25    36    35    30    33    35    38    37    34
## [31,]    0    0    0    0    0    0    0    0    0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0    46    27    43    37    35    36    27    46    37    39    22    38    39    35    45    49    31    35
## [32,]    0    0    0    0    0    0    0    0    0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0    42    30    41    32    37    29    42    30    24    28    36    38    33    39    32    26    31
## [33,]    0    0    0    0    0    0    0    0    0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0    33    34    29    26    32    33    44    41    43    37    45    37    42    29    36    20
## [34,]    0    0    0    0    0    0    0    0    0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0    44    27    35    34    33    43    32    36    37    41    44    44    35    30    40
## [35,]    0    0    0    0    0    0    0    0    0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0    31    33    37    37    42    37    31    25    39    46    46    42    37    43
## [36,]    0    0    0    0    0    0    0    0    0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0    32    26    42    30    25    32    31    29    24    34    32    38    30
## [37,]    0    0    0    0    0    0    0    0    0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0    32    37    32    27    32    33    42    36    34    37    31    28
## [38,]    0    0    0    0    0    0    0    0    0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0    36    31    22    32    33    35    30    35    31    27    34
## [39,]    0    0    0    0    0    0    0    0    0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0    43    24    46    41    43    46    50    37    41    33
## [40,]    0    0    0    0    0    0    0    0    0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0    34    38    40    40    37    36    33    35    35
## [41,]    0    0    0    0    0    0    0    0    0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0    37    36    30    30    37    41    31    26
## [42,]    0    0    0    0    0    0    0    0    0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0    34    38    30    31    39    30    38
## [43,]    0    0    0    0    0    0    0    0    0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0    48    33    32    35    30    34
## [44,]    0    0    0    0    0    0    0    0    0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0    28    51    30    30    27
## [45,]    0    0    0    0    0    0    0    0    0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0    38    41    38    38
## [46,]    0    0    0    0    0    0    0    0    0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0    33    37    34
## [47,]    0    0    0    0    0    0    0    0    0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0    32    40
## [48,]    0    0    0    0    0    0    0    0    0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0    35
## [49,]    0    0    0    0    0    0    0    0    0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0

Anda dapat melakukan beberapa verifikasi manual terhadap nilai mij individual dengan melakukan hal berikut:

laprim2check <- function(i,j) sum(apply(winners,1,function(x) i%in%x&j%in%x));
laprim2check(1,2);
## [1] 46
person bgoldst    schedule 20.07.2015
comment
Solusi yang sangat bagus. Terima kasih (dan itu pengingat bagi saya: Saya harus belajar C suatu hari nanti). - person Daniel Robledo; 21.07.2015

Inilah cara lain untuk melakukannya

    NewMatrix <- matrix(0,nrow = 49, ncol = 49)
Winning = matrix(0, nrow = 2, ncol = 100)
Winning[1,] = sample(1:49,100,replace=TRUE)
Winning[2,] = sample(1:49,100,replace=TRUE)
C = 0
while(C<dim(Winning)[2])
{
    C = C + 1
    if(Winning[2,C] <= Winning[1,C])
        NewMatrix[Winning[2,C],Winning[1,C]] = NewMatrix[Winning[1,C],Winning[2,C]] + 1
    if(Winning[1,C] < Winning[2,C])
        NewMatrix[Winning[1,C],Winning[2,C]] = NewMatrix[Winning[1,C],Winning[2,C]] + 1
}

Sampel membuat nomor acak untuk kode dari 1 hingga 49; kemudian ia membaca setiap iterasi dengan menempatkan +1 di setiap sel tempat baris dan kolom bertemu.

person Alex Feldman    schedule 20.07.2015