【问题标题】:rename the multiple columns in R重命名R中的多列
【发布时间】: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) &lt;- 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= 控制该后缀。您确定原始文件中的名称没有不同吗?你说的相似,不一样……

标签: r merge rename subset


【解决方案1】:

希望这能完成你的工作:

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

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

【讨论】:

  • 我使用 df1 = rename(df1,c("PRICE"="PRICE1","CLOSE"="CLOSE1")) 并得到:错误:必须命名所有参数。发现了一个问题 - 这被 dplyr 掩盖了:P
【解决方案2】:

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

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 “文件”中添加一个带有名称的变量,然后通过添加以下内容返回文件:

file[, varnam := nam]

然后使用 reshape2 库及其 dcast 函数在返回之前转换最终的 data.table “dat”。

【讨论】:

    【解决方案3】:

    我遇到了类似的问题。这是我最终使用的方法,尽管可能有更清洁的方法。

    函数 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",".")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-05-15
      • 1970-01-01
      • 2014-05-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-16
      相关资源
      最近更新 更多