根据管道内的向量重命名列

iod*_*iod 1 r pipe

我有一个df包含列A和的 data.frame B

df <- data.frame(A = 1:5, B = 11:15)
Run Code Online (Sandbox Code Playgroud)

还有另一个 data.frame ,df2我通过各种计算构建它,最终具有通用列名称 X1 和 X2,我无法直接控制它们(因为它在某一点作为矩阵传递)。所以它最终会变成这样:

mtrx <- matrix(1:10, ncol = 2)
mtrx %>% data.frame()
Run Code Online (Sandbox Code Playgroud)

我想将 df2 中的列重命名为与 df 相同。当然,我可以在通过简单的分配完成构建 df2 后执行此操作:

names(df2)<-names(df)
Run Code Online (Sandbox Code Playgroud)

我的问题是 - 有没有办法直接在管道内执行此操作?我似乎无法使用 dplyr::rename,因为它们必须采用 newname=oldname 的形式,而且我似乎无法对其进行矢量化。调用data.frame本身也是如此 - 据我所知,我不能只给它一个列名向量。我还缺少另一个选择吗?我希望是这样的

mtrx %>% data.frame() %>% rename(names(df))
Run Code Online (Sandbox Code Playgroud)

但这不起作用 - 给出错误Error: All arguments must be named

干杯!

mar*_*kus 5

您可以使用setNames

mtrx %>% 
  data.frame() %>% 
  setNames(., nm = names(df))
#  A  B
#1 1  6
#2 2  7
#3 3  8
#4 4  9
#5 5 10
Run Code Online (Sandbox Code Playgroud)

或者使用 的purrr等效项set_names

mtrx %>% 
  data.frame() %>% 
  purrr::set_names(., nm = names(df))
Run Code Online (Sandbox Code Playgroud)

第三个选项是"names<-"

mtrx %>% 
  data.frame() %>% 
  "names<-"(names(df))
Run Code Online (Sandbox Code Playgroud)