我有一个数据框,我想重命名几个具有相似名称约定的列(例如,以" 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)
答案 0 :(得分:8)
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
答案 1 :(得分:1)
rename()
对 rename_with()
进行了补充,它接受一个函数作为输入。此函数可以是 function(x) return (new_names)
,换句话说,您使用 purrr
简写形式 ~ new_names
作为重命名函数。
这使得 imho 成为最优雅的 dplyr 表达式。
# 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