第一次发现所有玩家在R中玩过两场,三场......比赛

时间:2016-04-09 15:28:25

标签: r match unique

对于以下示例:

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 个答案:

答案 0 :(得分: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