簡體   English   中英

如何使用名稱向量重命名 tidyverse 中的列

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM