【问题标题】:R - Add Column w/ File Name on For LoopR - 在 For 循环中添加带有/文件名的列
【发布时间】:2018-01-10 03:02:25
【问题描述】:

我在for loop 中使用assing 批量读取工作目录中的所有.csv 文件。然后我使用substr 来清理文件名。我想为每个带有文件名的文件添加一列,以便稍后在代码中进行更好的分析。但是,在清理文件名以添加列之后,我无法引用 for loop 中的文件。

#read in all files in folder
files <- list.files(pattern = "*.csv")
for (i in 1:length(files)){
  assign(substr(files[i], start = 11, stop = nchar(files[i])-4),  #clean file names
         read.csv(files[i], stringsAsFactors = FALSE))
  substr(files[i], start = 11, stop = nchar(files[i])-4)['FileFrom'] <- files[i]
}

【问题讨论】:

  • 为什么不将 substr 结果分配给变量,例如 file_name 和循环中某处的 n file[[i]][['source_file]] &lt;- file_name
  • @GuilhermeMarthe 你可能正在做某事,但我认为你可能正在做某事,但它倒退了。我创建了一个带有“substr”的文件,然后想在源文件中插入一列。

标签: r csv for-loop assign substr


【解决方案1】:

这行得通吗?

#read in all files in folder
files <- list.files(pattern = "*.csv")
filesCopy <- files
for (i in 1:length(files)){
  assign(substr(files[i], start = 11, stop = nchar(files[i])-4),  #clean file names
         read.csv(files[i], stringsAsFactors = FALSE))
  substr(files[i], start = 11, stop = nchar(files[i])-4)['FileFrom'] <- filesCopy[i]
}

【讨论】:

  • 这基本上是我已经在做的事情。我创建了一个文件列表,然后尝试从 substr 添加一个“FileFrom”列,但是,由于某种原因,它没有从 substr 注册文件名并添加一列。没有错误。
【解决方案2】:

assign 在这里似乎不是正确的功能,我认为您需要在您设置的字符串 cmd 上使用eval(parse())。内联注释解释更多:

# read in all files in folder
files <- list.files(pattern = "*.csv")

# loop through the files
for (i in 1:length(files)){
  # save the clean filename as a char var because it will be called again
  fnClean = substr(files[i], start = 1, stop = nchar(files[i])-4)

  # create a cmd as a string to be parsed and evaluated on-the-fly
  # the point here is that you can use the 'fnClean' var in the string
  # without knowing what it is - assign is expecting an inline string
  # ...not a string saved as a var, so it can't be used in this case
  loadFileCMD = paste0(fnClean,' = read.csv(files[i], stringsAsFactors = 
    FALSE)')
  print(loadFileCMD) # check the cmd
  eval(parse(text=loadFileCMD))

  # create another string command to be evaluated to insert the file name
  # to the 'FileFrom' field
  addFnCMD = paste0(fnClean,'$FileFrom = files[i]')
  print(addFnCMD) # check the cmd
  eval(parse(text=addFnCMD))
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-12-27
    • 2017-12-04
    • 2018-11-18
    • 2016-10-26
    • 2021-04-11
    • 2023-03-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多