Отображение одной и той же функции на несколько элементов в списке - PullRequest
0 голосов
/ 13 марта 2019

У меня есть несколько столбцов, каждый из которых имеет разное количество столбцов и разные имена столбцов.Я хочу стандартизировать имена столбцов для каждого строчного.Это работает для отдельного тибла:

library(magrittr)
library(purrr)

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

Имена столбцов для объекта tbl1 теперь все в нижнем регистре.

Однако, если я добавлю все свои тиблы в список, это неwork:

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

При этом имена столбцов для объектов tbl1, tbl2 и tbl3 не изменяются.Объекты в списке all_tbls теперь являются списками имен столбцов для каждого tbl, то есть того, что вы получите, если примените as.list () к результату colnames ()).

Почему это происходит?Есть ли лучший подход к этому?Я бы предпочел использовать функции tidyverse (например, map вместо * apply) для согласованности с другим кодом, но я открыт для других решений.РЕДАКТИРОВАТЬ: Чтобы было ясно, я хотел бы иметь возможность работать с исходными объектами tibble, т.е. желаемый результат для изменения имен столбцов tbl1, tbl2 и tbl3.

Другие вопросы и ответы, на которые я смотрели не нашел подсветку, включающую:

Ответы [ 3 ]

1 голос
/ 13 марта 2019
library(magrittr)
library(purrr)
all_tbls %<>% map(~set_names(.x,tolower(colnames(.x))))

Объекты в списке all_tbls теперь являются списками имен столбцов для каждого tbl

Потому что вы просите map уменьшить имена столбцов и вернуть их в виде списка

Для изменения на месте мы можем использовать 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)
1 голос
/ 13 марта 2019

Функция, которую вы отображаете, возвращает имена столбцов, вместо этого вам нужно вернуть фактический тиббл:

all_tbls %<>% map(function(tbl) { 
    colnames(tbl) %<>% map(tolower)
    tbl
})
0 голосов
/ 24 марта 2019

Вы можете использовать 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
# 
...