2017-02-22 23 views
1

Я знаю, что ответ на вопрос «как изменить имена в списке фреймов данных» ответил несколько раз. Тем не менее, я застрял, пытаясь сгенерировать функцию, которая может принять любой список в качестве аргумента и изменить все имена столбцов всех фреймов данных в списке. Я работаю с большим количеством файлов .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 и без нее, и сделал несколько изменений в коде, ни один из которых не оказался успешным. Я бы очень признателен за любую помощь, и мне очень хотелось бы понять, почему «за» проблема тоже. У меня были значительные проблемы в прошлых функциях обработки, которые принимают списки в качестве аргументов.

Большое спасибо за любой конструктивный ввод.

+2

* «он распечатывает все содержимое списка на консоль и не изменяет имена столбцы в кадрах данных в списке "* Похоже, что вы не назначаете результат. Вам нужно сделать 'mr1 <- nameChange (mr1)', чтобы назначить результат. Вы также можете сохранить его на новый объект, 'mr1_named <- nameChange (mr1)'. – Gregor

+0

Если я не пропустил что-то в вашем вопросе, почему бы просто не использовать 'setnames()' in lapply? Подобно примеру @Aron Boettcher: 'lapply (Your_list, function (x) setnames (x, old = names (x), new = c (new_names))' –

+0

@Gin_Salmon 'names <-' vs' setNames' это два способа сделать то же самое ... Я не думаю, что это настоящая проблема здесь. – Gregor

ответ

1

I думаю это может быть очень простое исправление: Сначала обобщите функцию, которую вы используете, чтобы переименовать столбцы. Это необходимо только для работы с одним фреймворком данных за раз.

renameFunction<-function(x,someNames){ 
     names(x) <- someNames 
     return(x) 
    } 

Теперь нам нужно определить имена, которые мы хотим изменить для каждого имени столбца.

someNames <- c('Date_Time', 'Temp_F', 'RH') 

Затем мы вызываем новую функцию и применяем ее к каждому элементу списка «mr1».

lapply(mr1, renameFunction, someNames) 

Я, возможно, получил некоторые детали неправильных по отношению к вашей точной sitiuation, но я использовал этот метод, прежде чем решать подобные вопросы. Поскольку вы смогли заставить его работать над конкретным случаем, я уверен, что это будет легко обобщать с помощью lapply

+0

Спасибо, gregor. Вы правы, и я быстро и грязно. – SeldomSeenSlim

+0

'renameFunction' уже существует в R под именем' setNames'. Его код реализации даже выглядит идентичным (минус ненужный «возврат»). –

Смежные вопросы