使用 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
有一个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