将相同的函数映射到列表中的多个小标题

Mapping the same function to multiple tibbles in a list

我有几个小标题,每个小标题都有不同的列数和不同的列名。我想将每个列名称标准化为全部小写。这适用于个人小标题:

library(magrittr)
library(purrr)

colnames(tbl1) %<>% map(tolower)

object tbl1 的列名现在全部小写。

但是,如果我将所有的小标题都放在一个列表中,这是行不通的:

all_tbls <- list(tbl1, tbl2, tbl3)
all_tbls %<>% map(function(tbl) {colnames(tbl) %<>% map(tolower)})

objecttbl1、tbl2 和 tbl3 的列名不会因此而改变。列表 all_tbls 中的 objects 现在是每个 tbl 的列名列表,即如果您将 as.list() 应用于 colnames() 的结果,您会得到什么) .

为什么会这样?有没有更好的方法来做到这一点?我更喜欢使用 tidyverse 函数(例如 map 而不是 *apply)来与其他代码保持一致,但我对其他解决方案持开放态度。编辑:明确地说,我希望能够使用原始的 tibble objects,即期望的结果是更改 tbl1、tbl2 和 tbl3 的名称。

我看过但没有发现启发性的其他问答包括:

您要映射的函数在 return 列名称中,您需要它 return 实际的标题:

all_tbls %<>% map(function(tbl) { 
    colnames(tbl) %<>% map(tolower)
    tbl
})
library(magrittr)
library(purrr)
all_tbls %<>% map(~set_names(.x,tolower(colnames(.x))))

The objects in the list all_tbls are now lists of the column names for each tbl

因为您要求 map 降低列名称并将它们 return 作为列表

要就地修改,我们可以使用 data.table::setnames,因为 data.table 使用就地复制而不是按引用复制。

library(data.table)
library(purrr)
map(list(df1,df2),~setnames(.,old = names(.), new = tolower(names(.))))

数据

df1 <- read.table(text='
A B
1 1',header=TRUE)

df2 <- read.table(text='
C D
2 2',header=TRUE)

您可以使用 purrr::mapdplyr::rename_all :

all_tbls <- list(head(iris,2), head(cars,2))

library(tidyverse)
all_tbls %>% map(rename_all, toupper)
# [[1]]
#   SEPAL.LENGTH SEPAL.WIDTH PETAL.LENGTH PETAL.WIDTH SPECIES
# 1          5.1         3.5          1.4         0.2  setosa
# 2          4.9         3.0          1.4         0.2  setosa
# 
# [[2]]
#   SPEED DIST
# 1     4    2
# 2     4   10
#