对于以下示例:
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。但这是相当的慢而笨重的
答案 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