【发布时间】:2015-10-21 11:57:56
【问题描述】:
我有 1000 个列名称相似的文件。例如:
df1
DATE PRICE CLOSE
df2
DATE PRICE CLOSE
等等……
如果我尝试按日期合并它们,它们确实会合并,但列保留了它们的旧名称,我想循环重命名它们
所以合并数据集是这样的
Date Price Close PRICE CLOSE
我想要类似的东西
DATE PRICE1 CLOSE1 PRICE2 CLOSE2.
有什么简单的方法吗? 我已经尝试了一些没有给我正确输出的东西
这是使用 plyr 包:
mod_join = function(mypath){
filenames=list.files(path=mypath, full.names=TRUE)
datalist = lapply(filenames, function(x){read.csv(file=x,header=T)[,c('Date','High','Low')]})
join_all(datalist,by = "Date")
}
这是对所有数据框使用合并命令:
merge2 = function(mypath){
filenames=list.files(path=mypath, full.names=TRUE)
datalist = lapply(filenames, function(x){read.csv(file=x,header=T)[,c('Date','High','Low')]})
Reduce(function(x,y) {merge(x,y,by.x= "Date",by.y = "Date",all=T)}, datalist)}
}
我尝试使用 for 循环,使数据框领先,然后使用每个数据框进行子集化并随后合并,但不知何故它没有对数据框进行子集化:
for (i in 1:1000){
data_subset <- sprintf('data_%d',i)
mydata_subset <- data.frame(,data_subset["Date"],data_subset["High"],data_subset["DayLow"])
obj_name <- paste('subset_Pricedata',i,sep ="_")
assign(obj_name,value = mydata_subset)
}
任何帮助都会很棒。 谢谢
【问题讨论】:
-
不清楚。您只想重命名列吗?
-
如果只是列名有问题,请尝试:
colnames(mergeddf) <- c("DATE",paste0(c("PRICE","CLOSE"),rep(seq_along(filenames),each=2))),其中mergeddf是您通过合并它们获得的data.frame。 -
是的,列名正在制造麻烦。所以每个数据框的列名都与其他数据框相同。所以当我尝试根据日期合并它们时。它会合并,但是当我合并时列名有问题我确实通过 all =TRUE 命令处理丢失的数据,但无法更改 colnames
-
您可以使用
colnames函数更改列名。请参阅我上面的评论。 -
merge(all=TRUE)的正常行为是按你说的做,即在y中与x中的名称匹配的变量名称后附加一个后缀。您甚至可以使用suffixes=控制该后缀。您确定原始文件中的名称没有不同吗?你说的相似,不一样……