2016-04-09 2 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, функция (х) which.max (cumsum (пр (seq_along (D $ команды), D $ Команда, ПОТЕХИ = seq_along) = = x))) 'возвращает индексы, т. е.' [1] 18 33 41 42', но мне нравится идея @ dig – rawr

ответ

3

0 может добавить столбец с общим количеством матчей, сыгранных командой, а затем использовать 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 
Смежные вопросы