重命名R中的多个列

时间:2015-07-30 08:14:06

标签: r merge rename subset

我有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")
} 

这是在所有数据框上使用merge命令:

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)
} 

任何帮助都会很棒。 感谢

3 个答案:

答案 0 :(得分:2)

希望这能完成你的工作:

library(plyr)
df1 = rename(df1,c("PRICE"="PRICE1","CLOSE"="CLOSE1"))
df2 = rename(df2,c("PRICE"="PRICE2","CLOSE"="CLOSE2"))
new = merge(df1,df2,all=TRUE)

如果您遇到任何困难,请发表评论。

答案 1 :(得分:1)

这种方法怎么样? 它应该很快,因为它使用data.table及其fread-function

library(data.table)
merge2 <- function(mypath){
     filenames <- list.files(path=mypath, full.names=TRUE)
     fileslist <- lapply(filenames, function(nam){
            # reads the file
            file <- fread(nam)
            setnames(file, 2, "price") # renames the second col to "price"
            setnames(file, 3, "close") # third to "close"
            return(file)
     })
     dat <- rbindlist(fileslist)
     return(dat)
}  

编辑

我刚刚意识到您要合并数据而不是长格式。你可以做的只是添加一个带有名称的变量到data.table&#34; file&#34;在通过添加:

返回文件之前
file[, varnam := nam]

然后投出最终的data.table&#34; dat&#34;在返回之前,使用reshape2库及其dcast函数。

答案 2 :(得分:0)

我有类似的问题。这是我最终使用的内容,尽管可能有一种更清洁的方式。

函数suffix_col_names将为列的子集添加后缀。我使用它是因为我最终将第1周和第2周的数据合并到第1-10列。

#function called suffix_col_names
suffix_col_names<-function(your_df, start_col, end_col, your_str, your_sep){
  for (i in start_col:end_col){
    colnames(your_df)[i]<-paste(colnames(your_df)[i], sep=your_sep,your_str)
  }
  return(your_df)
}
#call function to rename columns in week1 and week2
week_1_data<-suffix_col_names(week1,11,24,"1",".")
week_2_data<-suffix_col_names(week2,11,24,"2",".")