2014-11-13 1 views
2

У меня есть куча кадров данных, генерируемых:Изменение названия столбцов многих кадров данных в для цикла

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") 
+2

Пожалуйста, поместите данные в список вместо того, чтобы создавать их как отдельные, именованные объекты. Это делает переименование столбцов и операцию «слияния» бесконечно проще (поскольку один и тот же код будет работать независимо от количества кадров данных). – Thomas

+0

@baptiste, предположим, что я получил имена столбцов, все изменились на 'Column1'. Я не могу полностью понять часть «do.call». Я пробовал это: 'do.call (" merge ", c (l.df, by =" Column1 "))'. – bill999

+1

, который работал бы, если бы слияние разрешало более 2 data.frames в качестве аргументов. Здесь вы можете использовать 'Reduce (function (x, y) merge (x, y, by =" Column1 "), l.df)' – baptiste

ответ

4

Прежде всего, я хотел бы работать на список (data.frames). Вы можете использовать lapply для «набора высоты» каждого элемента списка. Я заимствую метод слияния из @baptiste (размещен в комментариях).

xy <- replicate(10, data.frame(a = 1:10, b = runif(10)), simplify = FALSE) 
xy <- lapply(xy, function(x) {names(x)[1] <- "Golum1"; x}) 
Reduce(function(x,y) merge(x,y,by="Golum1"), xy) 

    Golum1   b.x  b.y  b.x  b.y  b.x  b.y  b.x  b.y  b.x  b.y 
1  1 0.0002497286 0.44790338 0.12656118 0.85306085 0.9502253 0.92816557 0.6727456 0.3615492 0.71520420 0.26933313 
2  2 0.1416911036 0.56330792 0.03834924 0.95777112 0.4763716 0.28533075 0.8729803 0.7035205 0.49824660 0.15685903 
3  3 0.3454216446 0.42778131 0.35065726 0.35513107 0.6610847 0.21600874 0.9611296 0.2527102 0.62142047 0.32401890 
4  4 0.2128049061 0.20300980 0.35529195 0.19681124 0.6105881 0.85292309 0.3311055 0.4953804 0.05079081 0.98322541 
5  5 0.5967234119 0.93926727 0.74456886 0.25971581 0.3739592 0.01498909 0.2683361 0.9895955 0.45829244 0.76854781 
6  6 0.4843087369 0.04535037 0.29100912 0.05801034 0.1010084 0.31980135 0.7572697 0.6022717 0.86408382 0.10516840 
7  7 0.0624480459 0.58510411 0.62256365 0.97236759 0.6910560 0.21823825 0.8169870 0.3162987 0.79414611 0.43907780 
8  8 0.1764713391 0.05768646 0.30316764 0.25180931 0.9378119 0.06416274 0.6814944 0.9889381 0.13944101 0.51939788 
9  9 0.9533833019 0.70950657 0.04435285 0.92314396 0.4208451 0.34137729 0.8876309 0.9789025 0.43711122 0.71978702 
10  10 0.7814107563 0.93566272 0.76036172 0.71139862 0.5308587 0.19734855 0.8359664 0.6903358 0.22433803 0.09343658 

# warnings are due to name collisions 
1

Может быть, это работает для вас

for(i in 1:100){ 
    assign(paste("df", i, sep=""), data.frame(1,2)) 
} 

require(naturalsort) 
data<-do.call(rbind,sapply(ls(pattern="df[0-9]+"),function(x) get(x),simplify = F)) 
data<-data[naturalorder(rownames(data)),] 

colnames(data)[1] <-'Column1' 

head(data) 
Смежные вопросы