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

3

我有一个列表,其中包含多个具有相同结构的数据框,我想要更改所有数据框的列名。

我尝试过使用dplyr包中的rename选项以及使用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)

首先,我尝试使用dplyr中的rename_all命令,希望该命令能够自动将每一列与我的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))

如何使用preferably dplyr和map来实现将所有数据框列名命名为newNames向量的最终目标?
1个回答

4
如果我们更改所有列的名称,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,请确保使用 ~。根据 ?rename_all.funs 参数应该是:

.funs - 一个函数fun、一个purrr样式的lambda ~ fun(.)或这两种形式的列表。

foo2 <- map(foo, ~ .x %>%
               rename_all(~ newNames))

identical(foo1, foo2)
#[1] TRUE

在函数 renameColumn 中,存在两个问题 - 1) 没有return任何值。2) 参数不匹配 - 函数参数(myData)与内部使用的参数(data)不同。

renameColumn = function(myData, new_names){
     colnames(myData) <- new_names
     myData
 }

map(foo, renameColumn, new_names = newNames)

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