如何使用 tidyverse 管道重命名具有行字符值的列?

How to rename columns with row character values using tidyverse pipeline?

输入:

library(tidyverse)

df <- tibble(
  a = c("z", "x", "y"),
  b = c("m", "n", "o"),
  c = c("p", "q", "r")
)

期望的输出:用第一行值(第 2 和第 3 列)替换第 2 和第 3 列名称。

# A tibble: 3 x 3
  a     m     p    
  <chr> <chr> <chr>
1 z     m     p    
2 x     n     q    
3 y     o     r

到目前为止,这是我尝试过的。如您所见,我使用的向量 c("m", "p") 不是我想要的,我希望它是动态的。我也试过 cur_data() 但它不起作用 :/.

df %>% 
  rename_with(
    ~ str_replace(., ., c("m", "p")), tail(names(.), 2)
  )

我们可以使用

library(dplyr)
df %>% 
   rename_with(~  unlist(df[1, -1]),  names(.)[-1])

-输出

# A tibble: 3 x 3
#  a     m     p    
#  <chr> <chr> <chr>
#1 z     m     p    
#2 x     n     q    
#3 y     o     r 

或使用rename

df %>% 
       rename(!!! setNames(names(.)[-1], .[1, -1]))

或者可以使用 set_names

df %>% 
     set_names(c(names(.)[1], unlist(.[1, -1])))

有点冒险,但还是可以修改更多栏目:

library(dplyr)
library(purrr)


df %>%
  rename_with(~ df %>%
                select(b, c) %>%
                map_chr(., ~ first(.x)), .cols = c(2, 3))


# A tibble: 3 x 3
  a     m     p    
  <chr> <chr> <chr>
1 z     m     p    
2 x     n     q    
3 y     o     r