У меня есть куча кадров данных, генерируемых:Изменение названия столбцов многих кадров данных в для цикла
for(i in 1:100){
assign(paste("df", i, sep=""), data.frame(1,2))
}
Я хочу переименовать первый столбец всех этих 100 кадров данных, чтобы быть Column1
. (Обратите внимание, что в моих реальных данных каждый первый столбец уникален, в отличие от примера здесь, где каждый из них равен X1
.) Это будет одинаково для всех фреймов данных.
Для любого индивидуального, я могу это сделать. Например:
names(df45)[1]<-"Column1"
Однако при попытке автоматизировать процесс возникает проблема. Вот (неправильный) код, который я пробовал:
names(eval(parse(text=paste("df", i, sep=""))))[1] <- "Column1"
Как это изменить? И есть ли более быстрый способ доступа к переменным в циклах?
Я пришел через другие ответы, которые говорят, что лучше поставить эти вещи в списке и обработать его так:
#put into a list
l.df <- lapply(ls(pattern="df[0-9]+"), function(x) get(x))
for(i in 1:100){
names(l.df[[i]])[1] <- "Column1"
}
Однако, я хочу, чтобы иметь возможность объединить все данные кадры вместе следующим образом:
df <- merge(df1, df2, df3, df4, ....... df100, by="Column1")
Пожалуйста, поместите данные в список вместо того, чтобы создавать их как отдельные, именованные объекты. Это делает переименование столбцов и операцию «слияния» бесконечно проще (поскольку один и тот же код будет работать независимо от количества кадров данных). – Thomas
@baptiste, предположим, что я получил имена столбцов, все изменились на 'Column1'. Я не могу полностью понять часть «do.call». Я пробовал это: 'do.call (" merge ", c (l.df, by =" Column1 "))'. – bill999
, который работал бы, если бы слияние разрешало более 2 data.frames в качестве аргументов. Здесь вы можете использовать 'Reduce (function (x, y) merge (x, y, by =" Column1 "), l.df)' – baptiste