วิธีระบุคู่ใด ๆ ที่มีค่าสองค่าของเฟรมข้อมูล

ฉันมีแบบฝึกหัดกับ R โดยที่ฉันต้องทำงานกับล็อตโต้ดาต้าเฟรม ทุกครั้งที่ออกรางวัลใน La Primitiva ตั้งแต่ปี 1985 ถึง 2011 คร่าวๆ (ช่วงของตัวเลขคือตั้งแต่ 1 ถึง 49) มันคือตัวเลขสำหรับชุดผู้ชนะ:

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

ในประเด็นหนึ่งของแบบฝึกหัด ฉันมีคำถามต่อไปนี้ซึ่งเกี่ยวข้องกับข้อมูลล็อตโต้:

สำหรับแต่ละคู่ (i, j) โดยมี i, j ∈ {1,...,49}, i ‹ j ให้ทำดังต่อไปนี้:

ระบุการจับรางวัล mij ซึ่งทั้งสองหมายเลขอยู่ในชุดค่าผสมที่ชนะ

ฉันสร้างเมทริกซ์เพราะอีกทางเลือกหนึ่งที่ใช้ combn สร้างดาต้าเฟรมที่มี 1176 แถวและสองคอลัมน์ ซึ่งดูเทอะทะ

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

เมทริกซ์มี 49 แถวและ 49 คอลัมน์ ตอนนี้ ฉันต้องระบุคู่ ([i,],[,j]) ใดๆ ภายในดาต้าเฟรม (โดยหลักการแล้ว ฉันค้นหาว่าคู่ของตัวเลขใดๆ - เรามีชุดค่าผสม 1,176 ชุด - ตรงกับตัวเลขสองชุดของชุดค่าผสมผู้ชนะที่ฉันแสดงหรือไม่ ก่อน) โดยมีเงื่อนไขดังนี้: [i,] ‹ [,j] สุดท้าย นั่นหมายถึงเมทริกซ์ต่อไปนี้: http://i.stack.imgur.com/7CBbl.png

วิธีที่มีประสิทธิภาพในการทำเช่นนั้นใน R? ฉันเข้าใจแนวคิดบางอย่าง แต่ก็ทำไม่ได้ทันเวลา

ขอบคุณ. และขอโทษสำหรับภาษาอังกฤษที่เกะกะของฉัน


person Daniel Robledo    schedule 20.07.2015    source แหล่งที่มา
comment
ฉันสับสนกับภาษาในคำถามที่ระบุ m_ij วาด นี่หมายความว่าคุณต้องการนับจำนวนการออกรางวัลที่มีแต่ละคู่ หรือคุณต้องการเก็บหมายเลขแถวของข้อมูลล็อตเตอรี่เดิมที่แต่ละคู่เกิดขึ้นใช่หรือไม่   -  person Gregor Thomas    schedule 20.07.2015
comment
คุณบอกว่า combn ให้ data.frame แต่มันจะส่งคืนเมทริกซ์เสมอเมื่อฉันใช้มัน...   -  person Frank    schedule 20.07.2015
comment
หมายความว่าคุณต้องการนับจำนวนงวดที่มีแต่ละคู่หรือไม่ นี้ขอบคุณ.   -  person Daniel Robledo    schedule 20.07.2015
comment
แฟรงค์ นั่นเป็นเรื่องจริง ฉันลืมพูดถึงความจริงที่ว่าฉันแปลงเอาต์พุตดั้งเดิมจาก combn ในดาต้าเฟรม   -  person Daniel Robledo    schedule 20.07.2015


คำตอบ (2)


นี่คือวิธีแก้ปัญหาโดยใช้ Rcpp ซึ่งสาธิตจากข้อมูลการทดสอบที่สร้างแบบสุ่ม:

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

คุณสามารถตรวจสอบค่า mij ด้วยตนเองได้ดังนี้:

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
ทางออกที่ดีมาก ขอบคุณ (และนั่นเป็นเครื่องเตือนใจสำหรับฉัน: สักวันหนึ่งฉันต้องเรียนภาษา C) - person Daniel Robledo; 21.07.2015

นี่เป็นอีกวิธีที่จะทำ

    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
}

ตัวอย่างจะสร้างตัวเลขสุ่มสำหรับรหัสตั้งแต่ 1 ถึง 49 จากนั้นจะอ่านการวนซ้ำแต่ละครั้งโดยวาง +1 ในแต่ละเซลล์ที่แถวและคอลัมน์มาบรรจบกัน

person Alex Feldman    schedule 20.07.2015