使用 mutate 编程以创建新的数据列

Programming with mutate to create new data column

有一个data.frame像这样:

df <- data.frame("Config" = c("C1","C1","C2","C2"), "SN1" = 1:4, "SN2" = 5:8)

我正在努力使 df %<>% mutate 更通用。这是一个例子:

df %<>%
  mutate(
    Tag=paste(
      Config,
      as.character(SN1),
      as.character(SN2),
      sep="_"
    )
  )

需要的是将向量 c("Config", "SN1", "SN2") 传递给上面的 mutate 或执行相同工作的替代方法,即将新列 Tag 插入上面的 [=12] =].感谢您的帮助

正如我在评论中提到的,这不是关于运算符 %<>% 的问题,而是关于在 dplyr 函数中使用非标准求值 (NSE) 的问题。关于这个有一个 pretty good vignette,但是要掌握 NSE/tidy 评估的窍门仍然很棘手。

此外,正如我提到的,您作为示例所做的正是 tidyr::unite 所做的,因此如果这就是您所需要的,那么您实际上不需要编写任何内容。但这是一个很好的简单示例。

在这个函数custom_unite中,第一个参数是.data,正在操作的数据框(能够管道的习惯是第一个参数是数据框)。然后 ... 捕获灵活数量的裸列名称以粘贴在一起,new_col 是要创建的列的裸列名称,sep 按原样传递给 paste。 (我不小心调换了 tidyr::unite 的参数顺序,它采用 col, ... 而不是 ..., new_col。)

您需要为您的列创建quosures。对于单个裸列 new_col,您可以使用 enquo,但对于灵活数量的列,您可以在 ... 上使用 quos,然后将其与 [= 拼接27=].

要创建一个新列,您将使用 := 而不是 = 分配给未加引号的quosure。

library(tidyverse)

custom_unite <- function(.data, ..., new_col, sep = "_") {
  cols <- quos(...)
  new_col_quo <- enquo(new_col)

  .data %>%
    mutate(!!new_col_quo := paste(!!!cols, sep = sep))
}

df %>%
  custom_unite(Config, SN1, SN2, new_col = Tag)
#>   Config SN1 SN2    Tag
#> 1     C1   1   5 C1_1_5
#> 2     C1   2   6 C1_2_6
#> 3     C2   3   7 C2_3_7
#> 4     C2   4   8 C2_4_8

reprex package (v0.2.1)

创建于 2018-12-14