Я нашел несколько тем по этой теме, но нет ответа на мою конкретную проблему. У меня есть несколько фреймов данных и вектор, состоящий из имен этих фреймов данных. Я использую циклы 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))))
}
Однако замена шаблона работает. У меня такое чувство, что я очень близок, но я не могу понять это. Какие-либо предложения? Спасибо.
Попробуйте использовать это:
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
, и оба ответа изменяют ваш исходный фрейм данных.
Спасибо за дальнейшее объяснение. Теперь я вижу, что я сделал неправильно в цикле for, и я знаю, как обрабатывать несколько фреймов данных в будущем. Спасибо также за то, что указали мне на функцию list2env - очень удобно. Я многому научился! :)
Это работает, спасибо! Я бы предпочел хранить свои кадры данных отдельно, а не преобразовывать их в список. Означает ли ваш ответ, что это нельзя сделать в цикле for?