在dplyr管道中使用向量重命名多个列

4

我有一个数据框,我想用类似的命名约定(例如以“X”开头)和/或列位置(例如4:7)重命名多个列。新列的名称存储在向量中。如何在dplyr 链中重命名这些列?

# data
df <- tibble(RID = 1,Var1 = "A", Var2 = "B",old_name1 =4, old_name2 = 8, old_name3=20)
new_names <- c("new_name1","new_name2","new_name3")

#psuedo code
df %>%
  rename_if(starts_with('old_name'), new_names)
2个回答

11

使用rename_at选项可实现

df %>% 
  rename_at(vars(starts_with('old_name')), ~ new_names)
# A tibble: 1 x 6
#    RID Var1  Var2  new_name1 new_name2 new_name3
#   <dbl> <chr> <chr>     <dbl>     <dbl>     <dbl>
#1  1.00 A     B          4.00      8.00      20.0

然而,通过在列名上创建逻辑索引,可以编写一个与 rename_if 一起使用的函数。

df %>%
    rename_if(grepl("^old_name", names(.)), ~ new_names)
# A tibble: 1 x 6
#    RID Var1  Var2  new_name1 new_name2 new_name3
#  <dbl> <chr> <chr>     <dbl>     <dbl>     <dbl>
#1  1.00 A     B          4.00      8.00      20.0

rename_if通常检查列的值而不是列名,即

new_names2 <- c('var1', 'var2')
df %>%
     rename_if(is.character, ~ new_names2)
# A tibble: 1 x 6
#    RID var1  var2  old_name1 old_name2 old_name3
#   <dbl> <chr> <chr>     <dbl>     <dbl>     <dbl>
#1  1.00 A     B          4.00      8.00      20.0

5

更新 dplyr 1.0.0

rename() 现在新增了 rename_with() 函数,它可以接收一个函数作为输入。这个函数可以是 function(x) return (new_names),或者你可以使用 purrr 的简写形式 ~ new_names 作为重命名函数。

这使得 dplyr expression 更加优雅。

# shortest & most elegant expression
df %>% rename_with(~ new_names, starts_with('old_name'))

# A tibble: 1 x 6
    RID Var1  Var2  new_name1 new_name2 new_name3
  <dbl> <chr> <chr>     <dbl>     <dbl>     <dbl>
1     1 A     B             4         8        20

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接