繁体   English   中英

使用 dplyr cross() 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM