2015-06-22 3 views
1

Я использую цикл для чтения в нескольких файлах CSV и имен наборов данных Import1, import2 и т.д. Например:R: С помощью функции «имен» на наборе данных, созданных в цикле

assign(paste("import",i,sep=""), read.csv(files[i], header=FALSE)) 

Однако теперь я хочу переименовать переменные в каждом наборе данных. Я пробовал следующее:

names(as.name(paste("import",i,sep=""))) <- c("xxxx", "yyyy") 

Но получить ошибку «цель присвоения расширяется для неязыкового объекта». (Мне нужно изменить имя переменных в каждом наборе данных в пределах цикла, так как имена переменных должны быть разными в каждом наборе данных).

Любые предложения о том, как это сделать, будут высоко оценены.

Спасибо.

ответ

1

Лучшим подходом было бы чтение файлов в список data.frames вместо одного объекта data.frame для каждого файла. Предполагая files вектор имен файлов (как вы подразумеваете выше):

import <- lapply(files, read.csv, header=FALSE) 

Затем, если вы хотите работать на каждом data.frame в списке с помощью цикла, вы легко можете:

for (i in seq_along(import)) names(import[[i]]) <- c('xxx', 'yyy') 
+0

Вы повторяете это дважды, когда вам нужно сделать это один раз, если вы используете 'setNames':' import <- lapply (files, function (x) setNames (read.csv (x, header = FALSE) , c ('xxx', 'yyy'))) ' – Thomas

+0

Да, но я сконструировал ответ так, чтобы преднамеренно проиллюстрировать два разных понятия: 1) использование списка для хранения связанных объектов; 2) работа над списком объектов. Я думал, что это будет полезно для OP. Однако, если мы стремимся к максимально компактным решениям, существует также «import <- lapply (файлы, read.csv, header = FALSE, col.names = c (« xxx »,« yyy »)), что позволяет избежать необходимости для анонной функции – arvi1000

0

Хотя я согласен, что это было бы намного лучше держать data.frames в списке, а не создавать кучу переменных в вашей глобальной среде, вы можете также установить имена, когда вы читаете файлы в

assign(paste("import",i,sep=""), 
    read.csv(files[i], header=FALSE, col.names=c("xxxx", "yyyy"))) 

Использование assign() не очень «R-like».

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

  • Нет связанных вопросов^_^