【问题标题】:Assign Value based on group with data.table in r基于组在 r 中使用 data.table 分配值
【发布时间】:2018-03-29 08:37:34
【问题描述】:

我有以下数据集:

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 列中的相应行就会被分配与列表中的条件不匹配的投篮计数值(即名称!= Player A or Half != 1 or 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

我希望匹配 Name = Player A 的行始终具有他们上半场投篮次数的值。是否有某种我可以指定此分配的 data.table 语法?

【问题讨论】:

  • 您的 Half 数据与您的输出以及您的 Name 列不匹配
  • 您的代码 dt[ , Player_First_Made := .N, by = list(dt$Name == "Player A" & dt$Half == 1 & dt$Make_Miss == 1)] 不会创建输出。另外,您的输入数据集中的Player C 发生了什么?
  • 那是我的错误。我道歉。我一开始是三名球员,但我想把它改成两名,因为我觉得这让我的问题更加明显。我显然忘了更改第一个。

标签: r data.table


【解决方案1】:

正如@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 

如果这不是您要查找的内容,请编辑您的问题以使其更清晰。

【讨论】:

  • 那是我的错误。我道歉。我一开始是三名球员,但我想把它改成两名,因为我觉得这让我的问题更加明显。我显然忘了更改第一个。
  • 我希望我的回答对@klassic123 有帮助。如果是这样,请点击左侧投票箭头下方的勾号接受回答。
【解决方案2】:

执行此操作的 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))
  )

【讨论】:

    猜你喜欢
    • 2019-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-15
    • 2021-01-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多