I have a nested list with two data.frames, and I would like to change all variable names and variable categories to uppercase
my_list <- list(my_name = data.frame(c("Juan", "CArlos", "RRicardo")),
my_data = data.frame(c("Lunes", "Martes", "Miercoles")))
The result I am looking for is
$MY_NAME
c..JUAN....CARLOS....RRICARDO..
1 JUAN
2 CARLOS
3 RICARDO
$MY_DATA
c..LUNES....MARTES....MIERCOLES..
1 LUNES
2 MARTES
3 MIERCOLES
CodePudding user response:
We can loop over the list
and apply toupper
on the names
as well as the column values and the names of the list
setNames(lapply(my_list, \(x) {
x[] <- lapply(x, toupper)
names(x) <- toupper(names(x))
x}),
toupper(names(my_list)))
-output
$MY_NAME
C..JUAN....CARLOS....RRICARDO..
1 JUAN
2 CARLOS
3 RRICARDO
$MY_DATA
C..LUNES....MARTES....MIERCOLES..
1 LUNES
2 MARTES
3 MIERCOLES
CodePudding user response:
We need to call toupper
three times, to replace the names of the data.frames
, the names of the individual data.frame columns
, and the values in each column
We can use the tidyverse:
library(dplyr)
library(purrr)
my_list %>%
map(~mutate(.x, across(where(is.character), toupper)) %>% #values in each column
rename_with(toupper)) %>% # names of the individual data.frame columns
set_names(toupper(names(.))) #names of the data.frames
$MY_NAME
C..JUAN....CARLOS....RRICARDO..
1 JUAN
2 CARLOS
3 RRICARDO
$MY_DATA
C..LUNES....MARTES....MIERCOLES..
1 LUNES
2 MARTES
3 MIERCOLES
The where(is.character)
part was added for safety. We can obviate that by substituting across(.fns=toupper)
for the original call to
across()