将相同的函数映射到列表中的多个小标题
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 的名称。
我看过但没有发现启发性的其他问答包括:
- apply function to elements over a list
您要映射的函数在 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::map
和 dplyr::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
#
我有几个小标题,每个小标题都有不同的列数和不同的列名。我想将每个列名称标准化为全部小写。这适用于个人小标题:
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 的名称。
我看过但没有发现启发性的其他问答包括:
- apply function to elements over a list
您要映射的函数在 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::map
和 dplyr::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
#