[英]Assign Value based on group with data.table in r
我有以下数据集:
Name Make_Miss Half
Player A 1 1
Player B 1 1
Player A 0 2
Player A 0 1
Player A 1 1
Player B 0 2
其中Name是玩家的名字,Make_Miss是玩家是否进行了投篮,Half是投篮的哪一半。 我目前正在使用以下代码来计算上半场的命中率。
码:
dt[ , Player_First_Made := .N, by = list(dt$Name == "Player A" & dt$Half == 1 & dt$Make_Miss == 1)]
输出:
Name Make_Miss Half Player_First_Made
Player A 1 1 2
Player B 1 1 4
Player A 0 2 4
Player A 0 1 4
Player A 1 1 2
Player B 0 2 4
这里发生的是,只要播放器A在Make_Miss列中的输入为0,那么Player_First_Made列中的相应行就会被分配与列表中的条件不匹配的镜头计数值(即Name!= Player A或Half!= 1或Make_Miss!= 1); 但是,我的愿望是:
Name Make_Miss Half Player_First_Made
Player A 1 1 2
Player B 1 1 4
Player A 0 2 2
Player A 0 1 2
Player A 1 1 2
Player B 0 2 4
我希望与名称=玩家A匹配的行始终具有上半场他们进行的多次射击的价值。 我可以指定此分配的data.table语法吗?
正如@ chinsoon12指出的那样,您提供的数据实际上没有任何意义。 但是,这是一种使用dplyr的方法,我认为它将为您提供所需的...
library(dplyr)
# Make some data
DATA <- data.frame(Name = c("Player A", "Player B", "Player C",
"Player A", "Player A", "Player B"), Make_Miss = c(1,1,0,0,1,0),
Half = c(1,1,2,1,2,2))
# Use dplyr to calculate the sums of 'Half' for each player
OUT <- DATA %>% group_by(Name) %>% mutate(Player_First_Made = sum(Half))
# Check the output
> OUT
# A tibble: 6 x 4
# Groups: Name [3]
Name Make_Miss Half Player_First_Made
<fct> <dbl> <dbl> <dbl>
1 Player A 1 1 4
2 Player B 1 1 3
3 Player C 0 2 2
4 Player A 0 1 4
5 Player A 1 2 4
6 Player B 0 2 3
如果这不是您想要的内容,请编辑您的问题以使其更清楚。
一种执行此操作的data.table方法是:
dat[Half == 1, .(Player_First_Made = sum(Make_Miss)), .(Name)
][dat, on = c('Name')]
第一行计算每个玩家( .(Name)
)在上半场( Half == 1
)投篮的次数( sum(Make_Miss)
)。
第二行将上述步骤中生成的汇总表连接回原始数据集中。
这是我使用的示例数据:
dat <-
data.table(
Name = c('A', 'B'),
Make_Miss = round(runif(30, 0, 1)),
Half = round(runif(30, 1, 2))
)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.