【问题标题】:finding first time all players have played two, three ,... games in R发现所有玩家第一次在 R 中玩过两、三、... 场比赛
【发布时间】:2016-04-09 15:28:25
【问题描述】:

以下示例:

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

如果我想找到所有玩家都玩过一回合的第一行,那么以下工作:

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

但是如果我想在球队打了 2 场、3 场或更多场比赛时找到第一行怎么办?我坚持如何做到这一点,我想我要寻找的是第一个索引i,其中table(D$Team)[1:i] 的所有元素都大于2、3、4。但这很慢而且很笨重

【问题讨论】:

  • sapply(1:4, function(x) which.max(cumsum(ave(seq_along(D$Team), D$Team, FUN = seq_along) == x))) 返回索引,即[1] 18 33 41 42,但我喜欢@dig 的想法

标签: r match unique


【解决方案1】:

您可以添加一个包含球队比赛总数的列,然后使用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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    • 2021-07-18
    • 1970-01-01
    • 2017-10-24
    • 2015-01-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多