根据各个过滤器创建突变列

时间:2018-07-24 16:07:08

标签: r dplyr mutate

我有一个tbl_df,我试图根据各种过滤器创建唯一的列。我阅读了一些有关使用ifelse和其他mutate函数的文章,但我自己却无法解决。 df名为Test,并在下面列出。

accidental

我正在尝试根据特定过滤器的结果创建各种列。到目前为止,我的代码如下:

name   team salary season position
<chr> <int>  <int>  <int> <chr>   
AP        6     15   2017 OF      
AN       11      8   2016 SP      
AS        1      8   2014 SP      
AR        3     11   2018 SS      
AB        2     10   2015 3B      
AC        8      7   2017 RP      
Abe      11     10   2016 OF      
AM        7     12   2014 RP      
Ari      11     48   2018 1B      
BH       13     29   2015 OF           

我要创建的mutate列是:

  1. 命中率:对薪水中具有不等于SP或RP的职位以及2016-2018赛季的行中的所有值求和
  2. 投球:将薪水中所有值等于SP或RP的行以及2016-2018赛季的所有值相加
  3. 释放器:计算位置等于RP的所有行
  4. Over_40:计算薪水超过40的所有行
  5. Over_40_H:计算薪水超过40并且排名不等于SP或RP的所有行

我希望所有这些列和结果都按团队和季节分组(如上所示)

1 个答案:

答案 0 :(得分:1)

您可能很难解决这个问题,因为您似乎在试图汇总数据而不是对其进行变异。这样,您可以在summarise()中使用ifelse()来代替mutate()来实现。

library(tidyverse)

test %>%
  group_by(team, season) %>% 
  summarise(
    players = n(),
    hitting = sum(ifelse(!position %in% c("SP", "RP"), salary, 0)),
    pitching = sum(ifelse(position %in% c("SP", "RP"), salary, 0)),
    relievers = sum(ifelse(position == "RP", 1, 0)),
    over_40 = sum(ifelse(salary > 40, 1, 0)),
    over_40_h = sum(ifelse(salary > 40 & !position %in% c("SP", "RP"), 1, 0))
  ) %>% 
  mutate(
    hitting = ifelse(season < 2016 | season > 2018, NA, hitting),
    pitching = ifelse(season < 2016 | season > 2018, NA, pitching)
  ) %>% 
  arrange(team, season)

请注意:

  • 我添加了一个显示玩家人数的列,因为它提供了分组工作的基本检查。
  • 包含mutate()命令,以删除问题中所指定的2016年至2018年之间的年份的投手和击球手工资之和。但是,由于无论如何您都是按季节对数据进行分组的,因此简单地忽略您不感兴趣的年份的薪水也很容易。
  • 我已经按团队和季节安排了数据,但这主要是为了使结果更具可读性。
  • 由于您使用的是dplyr,因此我将列名更改为跟随tidyverse style guide