如何更改列表中所有数据框中的列名?

时间:2019-07-24 15:38:31

标签: r dplyr

我有一个包含几个数据帧的列表,每个数据帧具有相同的结构,并且我想更改所有数据帧的列名。

我尝试过使用dplyr包中的重命名选项,并使用map将其应用于列表中的每个数据框。

以下是一些代码:

#Generating some data to exemplify the situation
   foo = list(testA = as.data.frame(matrix(rnorm(25),ncol = 5)),
              testB = as.data.frame(matrix(rnorm(25),ncol = 5)),
              testC = as.data.frame(matrix(rnorm(25),ncol = 5)))

#New name for data frame columns
   newNames = c('Jan','Feb','Mar','Apr','May')

# Packages
   library(dplyr)
   library(purrr)

首先,我尝试使用rename_all中的dplyr,希望该命令将自动匹配我的newNames向量中名称(从头到尾)的每一列,但这没有用

foo <- foo %>% rename_all(meses)

然后我尝试创建一个名为renameColumn的简单函数:

renameColumn = function(myData, new_names){
  colnames(data) = new_names
}

并使用map中的函数。这种方法也行不通。

map(.x = foo, 
    .f = renameColumn(myData = foo, new_names = newNames))

如何实现最好使用newNamesdplyrmap向量命名所有数据帧列的最终目标?

1 个答案:

答案 0 :(得分:3)

如果我们要更改所有列的名称,则更简单的选择是set_names

foo1 <- map(foo, set_names, newNames)
foo1
#$testA
#         Jan        Feb           Mar        Apr       May
#1 -0.2886904  0.7716465  0.7103408795 -0.3209754 0.1580680
#2  0.8776646  0.1441515  1.9820892400 -2.5664872 0.2014593
#3 -1.9172889  1.4930354 -0.0005122859  2.7473145 0.9806701
#4 -0.7642281 -1.7382739  2.8574676114  0.1905533 1.0760523
#5 -0.2753768  0.4712059 -0.8955168101 -0.3923635 1.1017868

#$testB
#         Jan        Feb          Mar        Apr       May
#1 -1.2544946 -0.2131777  0.634624485  1.5436530 0.5811060
#2 -0.8092116  1.6085164  2.607820897  0.5454936 1.3869741
#3 -0.5460344  0.8028537 -0.007151318 -0.1711816 0.0867885
#4 -0.2104260 -1.3580934  0.835981664  1.3725253 0.0037494
#5 -0.6984177  1.2311613 -0.809374023 -0.2487121 0.8129935

#$testC
#         Jan         Feb        Mar         Apr         May
#1  0.3667708 -0.01209575 -0.9314844  0.05995604  0.58699473
#2  1.4171330  0.62793554 -0.2695517  2.21667643  0.90599396
#3  1.7093434 -0.98627309 -1.7552439 -0.96652771 -0.05704485
#4  0.2860338  1.34541312 -1.9608085 -1.23959279  0.19175618
#5 -0.9364102  2.47658828 -1.4883768  0.64809561 -0.99417796

,或者如果我们使用rename_all,请确保使用~。根据{{​​1}},?rename_all参数为

  

.funs-函数fun,purrr样式lambda〜fun(。)或任何一种形式的列表。

.funs

在功能foo2 <- map(foo, ~ .x %>% rename_all(~ newNames)) identical(foo1, foo2) #[1] TRUE 中,有两个问题-1)renameColumn中没有任何内容。 2)参数不匹配-函数参数(return)与内部参数(myData

不同
data