【问题标题】:rename a group_by statement using dplyr in R在 R 中使用 dplyr 重命名 group_by 语句
【发布时间】:2017-06-02 05:20:18
【问题描述】:

我想重命名在 dplyr 中使用 group_by 创建的列。创建的名称是format(date2, "%Y-%m"),不是很有帮助。我已经尝试了几件事。我希望新名称为“yrMth”

    df <- data.frame(Person = c(rep("abc",3), rep("eee", 5)),
             date = c("4/1/2016", "4/3/2016", "4/12/2016", "5/3/2016", "5/4/2016","5/10/2016","5/6/2016", "5/11/2016"),
             account = c("123","123","123","222","222","333","222","333"), stringsAsFactors = F)

    df$date2 <- mdy(df$date)

    df %>%
      group_by(format(date2, "%Y-%m"))

  Person      date account      date2 `format(date2, "%Y-%m")`
   <chr>     <chr>   <chr>     <date>                    <chr>
1    abc  4/1/2016     123 2016-04-01                  2016-04
2    abc  4/3/2016     123 2016-04-03                  2016-04
3    abc 4/12/2016     123 2016-04-12                  2016-04
4    eee  5/3/2016     222 2016-05-03                  2016-05
5    eee  5/4/2016     222 2016-05-04                  2016-05
6    eee 5/10/2016     333 2016-05-10                  2016-05
7    eee  5/6/2016     222 2016-05-06                  2016-05
8    eee 5/11/2016     333 2016-05-11                  2016-05

以下代码不起作用,任何想法。

    df %>%
      mutate( yrMth = group_by(format(date2, "%Y-%m")))

    df %>%
      rename( yrMth = group_by(format(date2, "%Y-%m")))

【问题讨论】:

  • 不是一个大 dplyr 专家,但你不能先变异然后分组 - df %&gt;% mutate(yrMth=format(date2, "%Y-%m")) %&gt;% group_by(yrMth) 吗?我会拭目以待,看看是否有 dplyr 高手能提供更好的方法。
  • 这就是你想要做的:df %&gt;% group_by(yrMth=format(date2, "%Y-%m"))。这实际上给出了与df %&gt;% mutate(yrMth=format(date2, "%Y-%m")) 相同的结果,只是在前一种情况下,数据框还具有分组属性。但是,为什么不在您第一次创建 date2 时按照您想要的方式格式化日期呢?

标签: r dplyr rename


【解决方案1】:

我知道这个答案有点晚了,但是在dplyr_1.0.2,你可以在调用group_by时简单地设置你的分组变量名:

df <- data.frame(Person = c(rep("abc",3), rep("eee", 5)),
             date = c("4/1/2016", "4/3/2016", "4/12/2016", "5/3/2016", "5/4/2016","5/10/2016","5/6/2016", "5/11/2016"),
             account = c("123","123","123","222","222","333","222","333"), stringsAsFactors = F)
df$date2 <- mdy(df$date)
df %>% group_by("yrMth" = format(date2, "%Y-%m"))

【讨论】:

    【解决方案2】:

    无需使用mutaterename。正如 eipi10 的评论所述,只需执行以下操作即可轻松实现:

    df %>% 
      group_by(yrMth = format(date2, "%Y-%m"))
    

    如果您要动态命名变量,这将是一个选项:

    name <- "yrMth2"
    
    df %>% 
      group_by(!!name := get(format(date2, "%Y-%m")) )
    

    【讨论】:

    • 太棒了,正是我在函数内使用 fct_lump_n 进行分组所需要的。
    【解决方案3】:

    df&lt;- group_by(df, date2) %&gt;% mutate(yrMth = format(date2, "%Y-%m"))

    这对我来说非常好

    但如果您想在不创建任何新列的情况下执行此操作,则可以使用以下函数:

    df<- mutate_at(df, vars(date), function(x){x =  format(x, "%Y-%m"); return(x)})
    

    【讨论】:

    • 如果只想添加yrMth列,则不需要分组步骤。
    • 同意。我这样做只是为了复制用户正在做的事情。
    • 我知道我可以向 df 数据框添加一个新列。我试图在不创建新列的情况下执行此操作,例如在 dplyr 中汇总。
    • 哦,明白了。您可以使用mutate_at 做到这一点。我在答案中添加了代码。如果这是你想要的,请告诉我
    猜你喜欢
    • 2021-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多