Я знаю, что ответ на вопрос «как изменить имена в списке фреймов данных» ответил несколько раз. Тем не менее, я застрял, пытаясь сгенерировать функцию, которая может принять любой список в качестве аргумента и изменить все имена столбцов всех фреймов данных в списке. Я работаю с большим количеством файлов .csv, все из которых будут иметь одинаковые имена столбцов. Я импортирую файлы в группы следующим образом:Как изменить имена столбцов в списке фреймов данных внутри функции?
# Get a group of drying data data files, remove 1st column
files <- list.files('Mang_Run1', pattern = '*.csv', full = TRUE)
mr1 <- lapply(files, read.csv, skip = 1, header = TRUE, colClasses = c("NULL", NA, NA, NA))
У меня будет 6 таких групп файлов. Если я запустил следующий код в одном списке, имена столбцов в каждом кадре данных в указанном списке будут правильно изменены.
for (i in seq_along(mr1)) {
names(mr1[[i]]) <- c('Date_Time', 'Temp_F', 'RH')
}
Однако, если я попытаюсь обобщить функцию (см код ниже), чтобы принять любой список в качестве аргумента, он не работает правильно.
nameChange <- function(ls) {
for (i in seq_along(ls)) {
names(ls[[i]]) <- c('Date_Time', 'Temp_F', 'RH')
}
return(ls)
}
Когда я звоню nameChange
на MR1 (список генерируемого сверху), она выводит все содержимое списка на консоль и не меняет названия столбцов в кадрах данных в списке. Мне явно не хватает чего-то фундаментального в отношении внутренней работы R здесь. Я пробовал эту функцию с return
и без нее, и сделал несколько изменений в коде, ни один из которых не оказался успешным. Я бы очень признателен за любую помощь, и мне очень хотелось бы понять, почему «за» проблема тоже. У меня были значительные проблемы в прошлых функциях обработки, которые принимают списки в качестве аргументов.
Большое спасибо за любой конструктивный ввод.
* «он распечатывает все содержимое списка на консоль и не изменяет имена столбцы в кадрах данных в списке "* Похоже, что вы не назначаете результат. Вам нужно сделать 'mr1 <- nameChange (mr1)', чтобы назначить результат. Вы также можете сохранить его на новый объект, 'mr1_named <- nameChange (mr1)'. – Gregor
Если я не пропустил что-то в вашем вопросе, почему бы просто не использовать 'setnames()' in lapply? Подобно примеру @Aron Boettcher: 'lapply (Your_list, function (x) setnames (x, old = names (x), new = c (new_names))' –
@Gin_Salmon 'names <-' vs' setNames' это два способа сделать то же самое ... Я не думаю, что это настоящая проблема здесь. – Gregor