[英]How to glue a function argument to .names in dplyr's across function?
[英]Setting names intuitively with dplyr across() function
我想操作几个列来创建新列,其名称是正在操作的列名称的变体。
dplyr 1.0.0 的 cross() function 似乎是这项工作的工具,但 .names 参数似乎功能有限。 这是我想要做的:
tmp <- iris %>%
mutate(across(starts_with('Sepal'),
~ .x - Petal.Length,
.names = gsub('Sepal', '', "{col}")))
但 gsub function 不起作用。 我可以通过以下方式解决这个问题:
tmp <- iris %>%
mutate(across(starts_with('Sepal'),
~ .x - Petal.Length,
.names = "mod_{col}"))
names(tmp) <- gsub("mod_Sepal", "mod_", names(tmp))
但这需要更多代码并且更难跟踪。 我在这里遗漏了什么吗?有没有更简单的方法来设置新的列名?
我们可以在mutate
步骤之后使用rename_at
library(dplyr)
library(stringr)
iris %>%
mutate(across(starts_with('Sepal'),
~ .x - Petal.Length)) %>%
rename_at(vars(starts_with("Sepal")), ~ str_remove(., "Sepal"))
根据?across
.names - 对于单个 function 案例,默认 (NULL) 等效于“{col}”
并且没有删除已经存在的列名的选项,但是,我们可以添加后缀或前缀
您可以将 function 传递给.names
作为 -
library(dplyr)
iris %>%
mutate(across(starts_with('Sepal'), ~ .x - Petal.Length,
.names = "{gsub('Sepal.', '', {col}, fixed = TRUE)}"))
# Sepal.Length Sepal.Width Petal.Length Petal.Width Species Length Width
#1 5.1 3.5 1.4 0.2 setosa 3.7 2.1
#2 4.9 3.0 1.4 0.2 setosa 3.5 1.6
#3 4.7 3.2 1.3 0.2 setosa 3.4 1.9
#4 4.6 3.1 1.5 0.2 setosa 3.1 1.6
#5 5.0 3.6 1.4 0.2 setosa 3.6 2.2
#6 5.4 3.9 1.7 0.4 setosa 3.7 2.2
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.