【问题标题】:Reading multiple csv files as new dataframes and renaming the columns读取多个 csv 文件作为新数据框并重命名列
【发布时间】:2013-08-19 17:36:52
【问题描述】:

我正在尝试使用 for 循环读取多个数据帧,并尝试在数据帧中分配变量名称。我想为所有数据框提供相同的列名。

我使用的for循环如下:

for (i in 1:15){
  assign(paste0("watersurf",i),read.table(paste0("D:/water-surf/","water-surf-",i,".dat"),header=F,skip=1,sep=""))
}

通过使用上面的代码,我能够创建 15 个数据框。如何将名称分配给所有数据框?我使用了以下代码:

for (i in 1:15){
  assign(paste0("watersurf",i),read.table(paste0("D:/water-surf/","water-surf-",i,".dat"),header=F,skip=1,sep=""))
  names(paste0("watersurf",i))<- c("X","Y","Z")
}

我得到如下错误:

Error in names(paste("watersurf", i)) <- c("X", "Y", "Z") : 
  target of assignment expands to non-language object

谁能建议我如何摆脱上述错误或任何有效的方法来一次重命名所有数据框中的列。当然,我可以尝试单独分配名称,但我正在寻找一个简单而优雅的解决方案。

我正在处理的一个csv文件的样本数据如下:

* , Water Levels, Depth Averaged
   407902.775  3437067.475        0.331
   406719.675  3436930.750        0.327
   405754.025  3436197.650        0.325
   404614.375  3435972.650        0.322
   404273.050  3434775.450        0.321
   403347.425  3433981.900        0.320
   404118.025  3433179.975        0.318
   404798.100  3432441.075        0.317
   403701.000  3432521.400        0.317
   402682.750  3432727.350        0.316
   402835.400  3431561.150        0.315
   403957.775  3431203.900        0.313
   405159.775  3431120.150        0.309
   405918.250  3430149.075        0.307
   405902.700  3428908.500        0.306
   405051.075  3428616.450        0.306
   404963.950  3427407.225        0.304
   405570.675  3426347.950        0.304
   406407.800  3425479.275        0.304
   406799.425  3424354.200        0.303
   407590.800  3423501.200        0.302
   408119.375  3422490.975        0.301
   408033.050  3421648.575        0.300
   407924.425  3420566.700        0.300

【问题讨论】:

  • 它不起作用,因为paste0("watersurf", i) 返回一个字符串。
  • @SeñorO:感谢您澄清这一点。还有其他方法可以更改列名吗?
  • 我不知道,虽然可能有一些。也许您最好的选择是在第一个循环中执行此操作,您 (1) 将数据读取到临时文件中。对象,(2)更改列名,(3)分配对象名称。

标签: r dataframe


【解决方案1】:

在有人提出更好的解决方案之前,将第一个循环更改为:

for (i in 1:15){
  Data <- read.table(paste0("D:/water-surf/","water-surf-",i,".dat"),header=F,skip=1))
  names(Data) <- c("X", "Y", "Z")
  assign(paste0("watersurf", i), Data)
}

【讨论】:

    【解决方案2】:

    如果我理解您的问题,您正在尝试将多个文本文件合并到一个数据框中,然后重命名这些列。您可以使用plyr 轻松做到这一点

    require(plyr)
    # set working directory
    setwd("D:/water-surf/")
    
    # check that works for 1 file
    table_1 <- read.table("./water-surf-1.dat", header= F, skip= 1, sep= "")
    
    # import all files
    files <- dir("D:/water-surf/") # declare the file directory
    table_all <- ldply(files, read.table, stringsAsFactors= TRUE, header= F, 
      skip= 1, sep= "")
    
    # rename the columns
    names(table_all) <- c("var_1", "var_2", "var_3")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-08-03
      • 2018-05-15
      • 2021-12-03
      • 1970-01-01
      • 1970-01-01
      • 2021-08-14
      相关资源
      最近更新 更多