2016-04-09 30 views
1

對於下面的例子:發現第一次所有的玩家都玩過兩個,三個......遊戲中的R

set.seed(24) 
D <- data.frame(Team=sample(LETTERS[1:6],100,TRUE),stringsAsFactors=FALSE) 

,如果我想在第一行的所有球員都有過1圈,然後以下作品:

max(match(unique(D$Team),D$Team)) 
# [1] 18 

但是如果我想找到第一排的時候球隊已經打了2場比賽,或者3場或更多?我堅持如何做到這一點,我想我會尋找的是第一個索引,i,其中table(D$Team)[1:i]的所有元素都大於2,3,4。但是,這是非常緩慢和笨重

+1

'sapply(1:4,函數(X)which.max(cumsum(AVE(seq_along(d $隊),d $團隊,FUN = seq_along)= = x)))'返回索引,即'[1] 18 33 41 42',但我喜歡@ dig的想法 – rawr

回答

3

你可以用一個團隊的比賽場次總數增加一列,然後用max(which(...))來詢問一個給定的量:

D$Matches <- vapply(1:nrow(D),FUN = function(r)sum(D$Team[1:r] == D$Team[r]),1) 

getWhenAllTeamsHavePlayedNMatches <- function(nMatches){ 
    if(sum(D$Matches == nMatches) == length(unique(D$Team))){ 
    return(max(which(D$Matches == nMatches))) 
    } 
    return(NA) 
} 

getWhenAllTeamsHavePlayedNMatches(4) 
# e.g. returns 42 

如果要預先計算所有值,並添加一列D

D$Matches <- vapply(1:nrow(D),FUN = function(r)sum(D$Team[1:r] == D$Team[r]),1) 

nTeams <- length(unique(D$Team)) 
D$NumMatchesWithAllTeam <- vapply(1:nrow(D), 
            FUN = function(r) { 
              if(sum(D$Matches[1:r] == D$Matches[r]) == nTeams) 
              return(D$Matches[r]) 
              return(NA) 
             } 
           ,1) 

所得data.frame:

> D 
    Team Matches NumMatchesWithAllTeam 
1  B  1     NA 
2  B  2     NA 
3  E  1     NA 
4  D  1     NA 
5  D  2     NA 
6  F  1     NA 
7  B  3     NA 
8  E  2     NA 
9  E  3     NA 
10  B  4     NA 
11  D  3     NA 
12  C  1     NA 
13  E  4     NA 
14  E  5     NA 
15  B  5     NA 
16  F  2     NA 
17  B  6     NA 
18  A  1      1 
19  D  4     NA 
20  A  2     NA 
21  A  3     NA 
22  D  5     NA 
23  E  6     NA 
24  A  4     NA 
25  B  7     NA 
26  E  7     NA 
27  A  5     NA 
28  D  6     NA 
29  D  7     NA 
30  A  6     NA 
31  B  8     NA 
32  B  9     NA 
33  C  2      2 
34  A  7     NA 
35  F  3     NA 
36  B  10     NA 
37  E  8     NA 
38  D  8     NA 
39  E  9     NA 
40  F  4     NA 
41  C  3      3 
42  C  4      4 
43  B  11     NA 
44  B  12     NA 
45  A  8     NA 
46  A  9     NA 
47  C  5     NA 
48  C  6     NA 
49  B  13     NA 
50  C  7     NA 
51  C  8     NA 
52  F  5      5 
53  C  9     NA 
54  E  10     NA 
55  D  9     NA 
56  F  6      6 
57  C  10     NA 
58  B  14     NA 
59  B  15     NA 
60  A  10     NA 
61  C  11     NA 
62  B  16     NA 
63  B  17     NA 
64  A  11     NA 
65  E  11     NA 
66  B  18     NA 
67  F  7      7 
68  F  8      8 
69  E  12     NA 
70  C  12     NA 
71  A  12     NA 
72  B  19     NA 
73  A  13     NA 
74  F  9      9 
75  D  10     NA 
76  C  13     NA 
77  D  11     NA 
78  E  13     NA 
79  A  14     NA 
80  E  14     NA 
81  D  12     NA 
82  A  15     NA 
83  D  13     NA 
84  B  20     NA 
85  C  14     NA 
86  C  15     NA 
87  B  21     NA 
88  F  10     10 
89  C  16     NA 
90  F  11     11 
91  B  22     NA 
92  E  15     NA 
93  F  12     12 
94  A  16     NA 
95  C  17     NA 
96  D  14     NA 
97  D  15     NA 
98  A  17     NA 
99  C  18     NA 
100 C  19     NA