簡體   English   中英

在r中使用data.table基於組分配值

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM