r-如何使用名称向量重命名tidyverse中的列



我编写了以下(工作(函数,从包含当前列名和所需列名的向量中更改列名,

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的其他部分来替换此功能。我宁愿不需要我自己的功能。

以下是所需功能的示例

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从starwars中丢失,并且没有中断函数。

您可以使用rename_with,但在下面的实现中,我仍然需要在现有名称上索引tofrom

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
#  ...

最新更新