R - заменить шаблон в именах столбцов в нескольких кадрах данных

Я нашел несколько тем по этой теме, но нет ответа на мою конкретную проблему. У меня есть несколько фреймов данных и вектор, состоящий из имен этих фреймов данных. Я использую циклы for, выполняющие одну и ту же операцию для всех из них, например, переименовывая столбцы:

for (i in import_names_vector) {
assign(i, rename(get(i), x = var1, y = var2, z = var3))
}

В нескольких других столбцах я хочу заменить шаблон в именах столбцов. Было легко придумать код для одного фрейма данных с помощью gsub:

colnames(df) <- gsub("_01", "1", colnames(df))

Однако я не могу включить этот оператор в цикл for. Я пробовал различные комбинации чего-то подобного - получаю разные сообщения об ошибках:

for (i in import_names_vector) {
colnames(i) <- gsub("_01", "1", colnames(get(i)))
}

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

for (i in import_names_vector) {
assign(i, gsub("_01", "1", colnames(get(i))))
}

Однако замена шаблона работает. У меня такое чувство, что я очень близок, но я не могу понять это. Какие-либо предложения? Спасибо.

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
181
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Попробуйте использовать это:

result <- lapply(mget(import_names_vector), function(x) 
                 setNames(x, gsub("_01", "1", colnames(x))))

Теперь, чтобы получить эту измененную информацию в ваших отдельных кадрах данных, используйте list2env.

list2env(result, .GlobalEnv)

Подобно вашей попытке, вы можете сделать:

for (i in import_names_vector) {
  assign(i, setNames(get(i), gsub("_01", "1", colnames(get(i)))))
}

Это работает, спасибо! Я бы предпочел хранить свои кадры данных отдельно, а не преобразовывать их в список. Означает ли ваш ответ, что это нельзя сделать в цикле for?

Jakob 11.12.2020 09:23

Нет, я не это имею в виду. Рекомендуется хранить данные в списке, если вы хотите выполнять с ними одни и те же операции. Я обновил ответ, чтобы использовать цикл for, и оба ответа изменяют ваш исходный фрейм данных.

Ronak Shah 11.12.2020 09:28

Спасибо за дальнейшее объяснение. Теперь я вижу, что я сделал неправильно в цикле for, и я знаю, как обрабатывать несколько фреймов данных в будущем. Спасибо также за то, что указали мне на функцию list2env - очень удобно. Я многому научился! :)

Jakob 11.12.2020 09:34

Другие вопросы по теме