2017-08-09 98 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