[英]How do I rename columns in tidyverse with vectors of names
我寫了以下(工作)function 來更改包含當前列名和所需列名的向量的列名,
change.name <- function (dt, from, to)
{
loc <- match(from, names(dt))
chg.loc <- loc[!is.na(loc)]
if (length(chg.loc) == 0)
return(dt)
names(dt)[chg.loc] = to[!is.na(loc)]
return(dt)
}
是否可以用重命名或 dplyr 的其他部分替換此 function。 我寧願不需要我自己的 function。
這是所需功能的示例,
cnames = tibble(from = c("hair_color", "banana", "height"),
to = c("HeadCap", "Orange", "VertMetric"))
starwars %>% select(name, height, mass, hair_color, skin_color) %>%
top_n(5) %>% change.name(cnames$from, cnames$to)
name VertMetric mass HeadCap skin_color <chr> <int> <dbl> <chr> <chr> 1 R2-D2 96 32 NA white, blue 2 R5-D4 97 32 NA white, red 3 Gasgano 122 NA none white, blue 4 Luminara Unduli 170 56.2 black yellow 5 Barriss Offee 166 50 black yellow
請注意,星際大戰中缺少 cnames$from 中的“香蕉”,並且不會觸發 function。
您可以使用rename_with
,但在下面的這個實現中,我仍然to
from
現有名稱上進行索引
idx = cnames$from %in% names(starwars)
starwars %>% select(name, height, mass, hair_color, skin_color) %>%
top_n(5) %>%
rename_with(~cnames$to[idx], cnames$from[idx])
根據這個答案,您可以使用
rename(any_of(setNames(cnames$from, cnames$to)))
(請注意,我並沒有將這個問題作為重復來結束,因為我認為名稱查找的表結構是一種常見情況和一個重要的區別。)
我確實希望有一個更具表現力的界面,例如在data.table
中,您可以執行setnames(data, old = from, new = to, skip_absent = TRUE)
。 我們可以自己滾動,但這違背了“不需要我自己的功能”的目的。 但我會模仿data.table
的語法:
rename_old_new = function(data, old, new, skip_absent = FALSE) {
if(skip_absent) {
rename(data, any_of(setNames(old, new)))
} else {
rename(data, all_of(setNames(old, new)))
}
}
一種選擇是使用rename_with()
+ recode()
並傳遞一個命名向量以使用!!!
取消引用拼接 .
starwars %>%
select(name, height, mass, hair_color, skin_color) %>%
rename_with(~ recode(.x, !!!setNames(cnames$to, cnames$from)))
# # A tibble: 87 × 5
# name VertMetric mass HeadCap skin_color
# <chr> <int> <dbl> <chr> <chr>
# 1 Luke Skywalker 172 77 blond fair
# 2 C-3PO 167 75 NA gold
# 3 R2-D2 96 32 NA white, blue
# 4 Darth Vader 202 136 none white
# 5 Leia Organa 150 49 brown light
# ...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.