【问题标题】:Creating Mutate Columns based on individual filters基于单个过滤器创建变异列
【发布时间】:2018-07-24 16:07:08
【问题描述】:

我有一个 tbl_df,我正在尝试根据各种过滤器创建唯一列。我做了一些关于使用 ifelse 和其他 mutate 函数的阅读,但我自己无法弄清楚这一点。 df 被命名为 Test 并在下面列出。

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           

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

summary <- test %>%
  group_by(team, season)

我正在尝试创建的变异列是:

  1. 命中:将 Salary 中位置不等于 SP 或 RP 的行的所有值和 2016-2018 季节相加
  2. Pitching:将 Salary 中位置等于 SP 或 RP 的行的所有值和 2016-2018 季节相加
  3. Relievers:计算位置等于 RP 的所有行
  4. Over_40:统计工资超过 40 的所有行
  5. Over_40_H:统计所有薪水超过 40 且职位不等于 SP 或 RP 的行

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

【问题讨论】:

    标签: r dplyr


    【解决方案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

    【讨论】:

    • 删除 cmets 作为问题已修复。
    • 我将把这个结果收集起来并按季节传播。如何添加一个汇总行,按团队显示数据下方所有团队的平均值?
    • adding summary rows to data 有几个选项——not likely to be added to dplyr,所以你必须选择最适合你的选项。
    • 谢谢马特!我将如何转置结果,以便团队名称在行中,而年份在列中,每年下方的点击列结果来自上方?
    • 您可以使用 tidyr 包中的 spread()。例如,如果您在上面的答案中使用select(team, season, hitting) %&gt;% spread(season, hitting) 扩展管道,这将为您提供一个表格,其中年份为列,团队为行,每个单元格显示特定年份的团队总薪水。
    猜你喜欢
    • 1970-01-01
    • 2021-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    • 1970-01-01
    • 2021-03-28
    • 1970-01-01
    相关资源
    最近更新 更多