2017-08-09 96 views
0

我哈瓦一個data.table DF如下。第三coulmn是有那個時間(以分鐘和秒描述)的球possesion隊。如何創建基於其他列在data.table索引列?

minute second teamId isGoal  
1:  10  22 Atletico MG  0 
2:  10  26 Atletico MG  0 
3:  10  30 Atletico MG  0 
4:  10  33 Atletico MG  0 
5:  10  35 Atletico MG  0 
6:  10  37 Atletico MG  0 
7:  10  38 Atletico MG  1 
8:  10  40 Atletico GO  0 
9:  10  42 Atletico GO  0 
10:  10  48 Atletico GO  1 
11:  10  51 Atletico MG  0 
12:  10  54 Atletico MG  1 
13:  10  60 Atletico MG  0 

我想創建twou新列。每個團隊總結每個團隊的目標數量。例如,輸出應該是:

 minute second teamId isGoal AtleticoMG AtleticoGO  
1:  10  22 Atletico MG  0    0   0 
2:  10  26 Atletico MG  0    0   0 
3:  10  30 Atletico MG  0    0   0 
4:  10  33 Atletico MG  0    0   0 
5:  10  35 Atletico MG  0    0   0 
6:  10  37 Atletico MG  0    0   0 
7:  10  38 Atletico MG  1    1   0 
8:  10  40 Atletico GO  0    1   0 
9:  10  42 Atletico GO  0    1   0 
10:  10  48 Atletico GO  1    1   1 
11:  10  51 Atletico MG  0    1   1 
11:  10  51 Atletico MG  0    1   1 
12:  10  54 Atletico MG  1    2   1 
13:  10  60 Atletico MG  0    2   1 

A想避免for循環。我敢肯定,在data.table中很容易做到,但是怎麼做呢?

回答

1

下面是使用dplyr溶液和「玩具」例如是類似於你在開封后得到的數據幀。

基本上,基本上你想爲每個團隊不超過1如果團隊在數據幀的特定行進一球指標列。然後你使用cumsum()功能,這些新生成的列內累積。

library(dplyr) 
x <- data.frame(teamID=c('A', 'A', 'B', 'A', 'A', 'B', 'B', 'B', 'A'), 
       isGoal=c(0,0,1,0,1,0,0,1, 0)) %>% 
mutate(AGoal = cumsum(isGoal*(teamID=='A')), 
     BGoal = cumsum(isGoal*(teamID=='B'))) 

輸出:

teamID isGoal AGoal BGoal 
A  0  0  0 
A  0  0  0 
B  1  0  1 
A  0  0  1 
A  1  1  1 
B  0  1  1 
B  0  1  1 
B  1  1  2 
A  0  1  2