2016-07-31 4 views
0

У меня есть данные файла событий с retrosheet.org. Это данные о бейсбольных играх, отформатированные таким образом, что каждое наблюдение представляет собой описание каждой игры в каждой игре в бейсбольном сезоне (в комплекте со справочными переменными для игры, игрока и игры).COUNTIF в R с несколькими ограничениями

> str(e.2015.1990) 
'data.frame': 4813807 obs. of 42 variables: 
$ GAME.ID        : Factor w/ 60464 levels "ANA201504100",..: 1 1 1 1 1 1 1 1 1 1 ... 
$ INNING        : num 1 1 1 1 1 1 1 1 1 2 ... 
$ BATTING.TEAM       : Factor w/ 2 levels "0","1": 1 1 1 1 1 1 2 2 2 1 ... 
$ OUTS         : int 0 1 2 2 2 2 0 1 2 0 ... 
$ BATTER        : Factor w/ 5107 levels "abrej003","ackld001",..: 73 167 33 120 163 100 34 256 200 209 ... 
$ BATTER.HAND       : Factor w/ 2 levels "L","R": 2 1 2 1 2 1 1 2 2 2 ... 
$ RES.BATTER       : Factor w/ 5107 levels "abrej003","ackld001",..: 73 167 33 120 163 100 34 256 200 209 ... 
$ RES.BATTER.HAND      : Factor w/ 2 levels "L","R": 2 1 2 1 2 1 1 2 2 2 ... 
$ PITCHER        : Factor w/ 3481 levels "abadf001","albem001",..: 187 187 187 187 187 187 204 204 204 187 ... 
$ PITCHER.HAND       : Factor w/ 2 levels "L","R": 1 1 1 1 1 1 1 1 1 1 ... 
$ RES.PITCHER       : Factor w/ 3481 levels "abadf001","albem001",..: 187 187 187 187 187 187 204 204 204 187 ... 
$ RES.PITCHER.HAND      : Factor w/ 2 levels "L","R": 1 1 1 1 1 1 1 1 1 1 ... 
$ FIRST.RUNNER       : Factor w/ 4369 levels "","abrej003",..: 1 1 1 1 104 140 1 1 1 1 ... 
$ SECOND.RUNNER      : Factor w/ 4048 levels "","abrej003",..: 1 1 1 26 1 90 1 1 1 1 ... 
$ THIRD.RUNNER       : Factor w/ 3729 levels "","ackld001",..: 1 1 1 1 1 1 1 1 1 1 ... 
$ EVENT.TEXT       : chr "63/G" "6/P" "D8/L+" "S9/G.2-H" ... 
$ EVENT.TYPE       : Factor w/ 21 levels "2","3","4","5",..: 1 1 19 18 18 1 1 1 1 1 ... 
$ AB.FLAG        : logi TRUE TRUE TRUE TRUE TRUE TRUE ... 
$ HIT.VALUE       : int 1 1 3 2 2 1 1 1 1 1 ... 
$ SH.FLAG        : logi FALSE FALSE FALSE FALSE FALSE FALSE ... 
$ SF.FLAG        : logi FALSE FALSE FALSE FALSE FALSE FALSE ... 
$ DOUBLE.PLAY.FLAG      : logi FALSE FALSE FALSE FALSE FALSE FALSE ... 
$ TRIPLE.PLAY.FLAG      : logi FALSE FALSE FALSE FALSE FALSE FALSE ... 
$ RBI.ON.PLAY       : num 0 0 0 1 0 0 0 0 0 0 ... 
$ BATTED.BALL.TYPE      : Factor w/ 5 levels "","F","G","L",..: 3 5 4 3 4 5 3 3 5 4 ... 
$ BATTER.DEST       : int 0 0 2 1 1 0 0 0 0 0 ... 
$ RUNNER.ON.1ST.DEST     : int 0 0 0 0 2 1 0 0 0 0 ... 
$ RUNNER.ON.2ND.DEST     : int 0 0 0 4 0 2 0 0 0 0 ... 
$ RUNNER.ON.3RD.DEST     : int 0 0 0 0 0 0 0 0 0 0 ... 
$ SB.FOR.RUNNER.ON.1ST.FLAG   : logi FALSE FALSE FALSE FALSE FALSE FALSE ... 
$ SB.FOR.RUNNER.ON.2ND.FLAG   : logi FALSE FALSE FALSE FALSE FALSE FALSE ... 
$ SB.FOR.RUNNER.ON.3RD.FLAG   : logi FALSE FALSE FALSE FALSE FALSE FALSE ... 
$ CS.FOR.RUNNER.ON.1ST.FLAG   : logi FALSE FALSE FALSE FALSE FALSE FALSE ... 
$ CS.FOR.RUNNER.ON.2ND.FLAG   : logi FALSE FALSE FALSE FALSE FALSE FALSE ... 
$ CS.FOR.RUNNER.ON.3RD.FLAG   : logi FALSE FALSE FALSE FALSE FALSE FALSE ... 
$ PO.FOR.RUNNER.ON.1ST.FLAG   : logi FALSE FALSE FALSE FALSE FALSE FALSE ... 
$ PO.FOR.RUNNER.ON.2ND.FLAG   : logi FALSE FALSE FALSE FALSE FALSE FALSE ... 
$ PO.FOR.RUNNER.ON.3RD.FLAG   : logi FALSE FALSE FALSE FALSE FALSE FALSE ... 
$ RESPONSIBLE.PITCHER.FOR.RUNNER.ON.1ST: Factor w/ 3433 levels "","albua001",..: 1 1 1 1 161 161 1 1 1 1 ... 
$ RESPONSIBLE.PITCHER.FOR.RUNNER.ON.2ND: Factor w/ 3408 levels "","abadf001",..: 1 1 1 133 1 133 1 1 1 1 ... 
$ RESPONSIBLE.PITCHER.FOR.RUNNER.ON.3RD: Factor w/ 3337 levels "","abadf001",..: 1 1 1 1 1 1 1 1 1 1 ... 
$ EVENT.NUM       : Factor w/ 177 levels "1","10","100",..: 1 90 101 112 123 134 145 156 167 2 ... 

Исходя из этого, я хотел бы рассчитать общий итог игры для каждого игрока для каждой игры. Я хотел бы отформатировать фрейм данных таким образом, чтобы каждое наблюдение было описанием производительности одного игрока в одной игре сезона, и каждый ИГРОК в каждой игре составляет всю совокупность наблюдений.

Я создал новую базу данных с двумя столбцами, GAME.ID и PLAYER.ID, чтобы каждый STARTER в каждой игре составлял всю совокупность наблюдений.

> str(k.2015.1990) 
'data.frame': 1146866 obs. of 2 variables: 
$ GAME.ID : Factor w/ 60464 levels "ANA201504100",..: 1 2 3 4 5 6 7 8 9 10 ... 
$ PLAYER.ID: Factor w/ 4699 levels "altuj001","bettm001",..: 11 11 11 12 14 12 12 24 24 24 ... 

То, что я думаю, что нужно делать дальше, это создать дополнительные векторы (для каждого стата Я хочу, чтобы вычислить) таким образом, что каждое наблюдение указанного вектора создает уникальное подмножество моих данных событий, определяемые:

e.2015.1990$GAME.ID = k.2015.1990$GAME.ID 
e.2015.1990$PLAYER.ID = k.2015.1990$PLAYER.ID 

, а затем вычисляет этот stat из этого подмножества. Я знаю, как создавать векторы и подмножества в R, но не векторы, которые создают уникальные подмножества для каждого наблюдения. Я думаю, мне нужно использовать

function(x) 

для этого; но я новичок в R и не имею опыта работы с этой функцией.

Я собираюсь сделать воспроизводимый пример для удобства. В этом примере цель состоит в том, чтобы вычислить общую сумму для каждого игрока в первых двух играх регулярного сезона Ангела 2015 года.

Я сделал подмножество данных файла событий, состоящий из 156 наблюдений, соответствующих этим двум играм. Для простоты я включил только переменные GAME.ID, BATTER и HIT.VALUE.

  GAME.ID BATTER HIT.VALUE 
1 ANA201504100 escoa003   1 
2 ANA201504100 mousm001   1 
3 ANA201504100 cainl001   3 
4 ANA201504100 hosme001   2 
5 ANA201504100 morak001   2 
6 ANA201504100 gorda001   1 
7 ANA201504100 calhk001   1 
8 ANA201504100 troum001   1 
9 ANA201504100 pujoa001   1 
10 ANA201504100 riosa002   1 
11 ANA201504100 peres002   1 
12 ANA201504100 infao001   1 
13 ANA201504100 freed001   1 
14 ANA201504100 cronc002   1 
15 ANA201504100 aybae001   1 
16 ANA201504100 escoa003   1 
17 ANA201504100 mousm001   1 
18 ANA201504100 cainl001   1 
19 ANA201504100 hosme001   1 
20 ANA201504100 morak001   1 
21 ANA201504100 iannc001   1 
22 ANA201504100 cowgc001   2 
23 ANA201504100 giavj001   1 
24 ANA201504100 calhk001   3 
25 ANA201504100 troum001   1 
26 ANA201504100 pujoa001   1 
27 ANA201504100 gorda001   1 
28 ANA201504100 riosa002   1 
29 ANA201504100 peres002   1 
30 ANA201504100 freed001   2 
31 ANA201504100 cronc002   1 
32 ANA201504100 aybae001   1 
33 ANA201504100 iannc001   1 
34 ANA201504100 infao001   1 
35 ANA201504100 escoa003   2 
36 ANA201504100 mousm001   1 
37 ANA201504100 cainl001   2 
38 ANA201504100 hosme001   1 
39 ANA201504100 cowgc001   1 
40 ANA201504100 giavj001   1 
41 ANA201504100 calhk001   1 
42 ANA201504100 morak001   5 
43 ANA201504100 gorda001   1 
44 ANA201504100 riosa002   1 
45 ANA201504100 peres002   1 
46 ANA201504100 troum001   2 
47 ANA201504100 pujoa001   1 
48 ANA201504100 freed001   5 
49 ANA201504100 cronc002   1 
50 ANA201504100 infao001   1 
51 ANA201504100 escoa003   1 
52 ANA201504100 mousm001   2 
53 ANA201504100 cainl001   1 
54 ANA201504100 cainl001   1 
55 ANA201504100 aybae001   1 
56 ANA201504100 iannc001   1 
57 ANA201504100 joycm001   3 
58 ANA201504100 giavj001   1 
59 ANA201504100 hosme001   1 
60 ANA201504100 morak001   1 
61 ANA201504100 gorda001   1 
62 ANA201504100 riosa002   1 
63 ANA201504100 riosa002   1 
64 ANA201504100 calhk001   1 
65 ANA201504100 troum001   2 
66 ANA201504100 pujoa001   1 
67 ANA201504100 freed001   1 
68 ANA201504100 peres002   2 
69 ANA201504100 infao001   2 
70 ANA201504100 escoa003   1 
71 ANA201504100 mousm001   1 
72 ANA201504100 cainl001   1 
73 ANA201504100 hosme001   1 
74 ANA201504100 morak001   1 
75 ANA201504100 cronc002   1 
76 ANA201504100 aybae001   1 
77 ANA201504100 iannc001   1 
78 ANA201504100 joycm001   1 
79 ANA201504110 escoa003   1 
80 ANA201504110 mousm001   1 
81 ANA201504110 cainl001   1 
82 ANA201504110 hosme001   1 
83 ANA201504110 calhk001   5 
84 ANA201504110 troum001   2 
85 ANA201504110 pujoa001   1 
86 ANA201504110 joycm001   1 
87 ANA201504110 freed001   1 
88 ANA201504110 morak001   1 
89 ANA201504110 gorda001   1 
90 ANA201504110 riosa002   1 
91 ANA201504110 aybae001   2 
92 ANA201504110 navae001   1 
93 ANA201504110 buted001   1 
94 ANA201504110 giavj001   1 
95 ANA201504110 peres002   1 
96 ANA201504110 infao001   1 
97 ANA201504110 escoa003   1 
98 ANA201504110 giavj001   1 
99 ANA201504110 calhk001   1 
100 ANA201504110 troum001   1 
101 ANA201504110 mousm001   5 
102 ANA201504110 cainl001   2 
103 ANA201504110 hosme001   1 
104 ANA201504110 hosme001   1 
105 ANA201504110 morak001   3 
106 ANA201504110 gorda001   1 
107 ANA201504110 riosa002   2 
108 ANA201504110 peres002   5 
109 ANA201504110 infao001   2 
110 ANA201504110 escoa003   1 
111 ANA201504110 pujoa001   1 
112 ANA201504110 joycm001   1 
113 ANA201504110 freed001   1 
114 ANA201504110 mousm001   1 
115 ANA201504110 cainl001   1 
116 ANA201504110 hosme001   2 
117 ANA201504110 morak001   2 
118 ANA201504110 gorda001   1 
119 ANA201504110 riosa002   1 
120 ANA201504110 aybae001   1 
121 ANA201504110 navae001   1 
122 ANA201504110 buted001   2 
123 ANA201504110 giavj001   1 
124 ANA201504110 calhk001   3 
125 ANA201504110 troum001   2 
126 ANA201504110 pujoa001   1 
127 ANA201504110 riosa002   1 
128 ANA201504110 peres002   2 
129 ANA201504110 infao001   1 
130 ANA201504110 escoa003   2 
131 ANA201504110 mousm001   1 
132 ANA201504110 joycm001   1 
133 ANA201504110 freed001   1 
134 ANA201504110 aybae001   1 
135 ANA201504110 cainl001   1 
136 ANA201504110 hosme001   1 
137 ANA201504110 morak001   2 
138 ANA201504110 gorda001   1 
139 ANA201504110 riosa002   1 
140 ANA201504110 navae001   1 
141 ANA201504110 iannc001   1 
142 ANA201504110 giavj001   1 
143 ANA201504110 peres002   1 
144 ANA201504110 infao001   1 
145 ANA201504110 escoa003   1 
146 ANA201504110 calhk001   1 
147 ANA201504110 troum001   1 
148 ANA201504110 pujoa001   1 
149 ANA201504110 mousm001   2 
150 ANA201504110 cainl001   1 
151 ANA201504110 hosme001   1 
152 ANA201504110 morak001   1 
153 ANA201504110 gorda001   1 
154 ANA201504110 joycm001   1 
155 ANA201504110 freed001   1 
156 ANA201504110 aybae001   1 

Я также сделал подмножество новой базы данных, что соответствует 40 стартеров в этих двух играх.

   GAME.ID PLAYER.ID 
1  ANA201504100 escoa003 
60465 ANA201504100 mousm001 
120929 ANA201504100 cainl001 
181393 ANA201504100 hosme001 
241857 ANA201504100 morak001 
302321 ANA201504100 gorda001 
362785 ANA201504100 riosa002 
423249 ANA201504100 peres002 
483713 ANA201504100 infao001 
1117610 ANA201504100 vargj001 
573434 ANA201504100 calhk001 
633898 ANA201504100 troum001 
694362 ANA201504100 pujoa001 
754826 ANA201504100 freed001 
815290 ANA201504100 cronc002 
875754 ANA201504100 aybae001 
936218 ANA201504100 iannc001 
996682 ANA201504100 cowgc001 
1057146 ANA201504100 giavj001 
1117613 ANA201504100 santh001 
2  ANA201504110 escoa003 
60466 ANA201504110 mousm001 
120930 ANA201504110 cainl001 
181394 ANA201504110 hosme001 
241858 ANA201504110 morak001 
302322 ANA201504110 gorda001 
362786 ANA201504110 riosa002 
423250 ANA201504110 peres002 
483714 ANA201504110 infao001 
2100000 ANA201504110 guthj001 
573435 ANA201504110 calhk001 
633899 ANA201504110 troum001 
694363 ANA201504110 pujoa001 
754827 ANA201504110 joycm001 
815291 ANA201504110 freed001 
875755 ANA201504110 aybae001 
936219 ANA201504110 navae001 
996683 ANA201504110 buted001 
1057147 ANA201504110 giavj001 
2100001 ANA201504110 weavj003 

Я думаю, что там должен быть способ, чтобы добавить столбец к этой последней базы данных таким образом, что каждое наблюдение ссылается на запись GAME.ID и PLAYER.ID на своей строке, ищет первую базу данных, чтобы изолировать эти замечания, если GAME.ID = GAME.ID и PLAYER.ID = BATTER, подсчитывает количество наблюдений в этом подмножестве, где HIT.VALUE> 1 (1 = по умолчанию, 2 = один, 3 = двойной, 4 = тройной и 5 = homerun) , а затем возвращает это значение для наблюдения. В excel это может быть сделано с помощью функции CountIf(), которая могла бы легко скопировать длину вектора. Однако я не знаю, как это сделать в R.

ответ

0

Я думаю, что это может быть то, что вы ищете. Он группирует второй-последний набор данных на GAME.ID и BATTER, а затем подсчитывает количество обращений к группе, которые составляют> 1.

library(data.table) 
dt<-setDT(df)[, list(count_hits = sum(HIT.VALUE>1)),by=c("GAME.ID","BATTER")] 

head(dt) 
     GAME.ID BATTER count_hits 
1: ANA201504100 escoa003   1 
2: ANA201504100 mousm001   1 
3: ANA201504100 cainl001   2 
4: ANA201504100 hosme001   1 
5: ANA201504100 morak001   2 
6: ANA201504100 gorda001   0 

Другой вариант в базовом R является:

res<-aggregate(x=list(count_hits=df$HIT.VALUE), by=list(GAME.ID=df$GAME.ID,BATTER=df$BATTER), FUN = function(x) sum(x>1)) 

head(res) 
     GAME.ID BATTER count_hits 
1 ANA201504100 aybae001   0 
2 ANA201504110 aybae001   1 
3 ANA201504110 buted001   1 
4 ANA201504100 cainl001   2 
5 ANA201504110 cainl001   1 
6 ANA201504100 calhk001   1 

 Смежные вопросы

  • Нет связанных вопросов^_^