簡體   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