【问题标题】:Extracting file numbers from file names in r and looping through files从r中的文件名中提取文件号并循环文件
【发布时间】:2016-09-04 18:30:11
【问题描述】:

我有一个充满 .txt 文件的文件夹,我想循环并压缩到一个数据框中,但每个 .txt 文件都是一个主题的数据,并且文本文件中没有指示主题编号或时间的列研究中的点(例如 1-5)。我需要在我的循环中添加一两行代码来查找四个数字的字符串(即每个文件都标记为:“4325.5_ERN_No_Startle”),然后创建一个包含 4325 的列和另一个包含 5 的列该主题的每个数据点,直到循环到达下一个。找了好久,还是空着,有什么建议吗?

我还没有完全让循环工作:

path = "/Users/me/Desktop/Event Codes/ERN task/ERN text files transferred"
out.file <- ""
file <- ""           
file.names <- dir(path, pattern =".txt")         
for(i in 1:length(file.names)){
  file <- read.table(file.names[i],header=FALSE, fill = TRUE)
  out.file <- rbind(out.file, file)
}

在我中途收到此错误消息之前运行正常:

read.table 中的错误(file.names[i],header = FALSE,fill = TRUE): 输入中没有可用的行

【问题讨论】:

  • 可以尝试在 read.table 周围使用try() 看看是否是因为文件为空。打印出您在死机时所处的循环也可以帮助您识别可能是问题的文件。
  • 除了错误,使用file&lt;-lapply(file.names, read.table, header=F, fill=T) 后跟out.file &lt;- do.call(rbind, file) 会更快
  • 我总是在导致错误的循环中抛出print(file.names[i])。这样您就可以自己检查有罪的文件。也只需使用for (ff in file.names)——循环会自动为你遍历file.names的元素

标签: r for-loop import


【解决方案1】:

你可以尝试使用tryCatch,它基本上会给你一个NULL而不是一个错误。

file <- tryCatch(read.table(file.names[i],header=FALSE, fill = TRUE), error=function(e) NULL))

【讨论】:

    【解决方案2】:

    考虑使用正则表达式来解析研究期间和主题的文件名,然后将两者绑定在list.fileslapply 中:

    path = "path/to/text/files"
    
    # ANY TXT FILE WITH PATTERN OF 4 DIGITS FOLLOWED BY A PERIOD AND ONE DIGIT
    file.names <- list.files(path, pattern="*[0-9]{4}\\.[0-9]{1}.*txt", full.names=TRUE)
    
    # IMPORT ALL FILES INTO A LIST OF DATAFRAMES AND BINDS THE REGEX EXTRACTS
    dfList <- lapply(file.names, function(x) {
                        if (file.exists(x)) {
                            data.frame(period=regmatches(x, gregexpr('[0-9]{4}', x))[[1]],
                                       subject=regmatches(x, gregexpr('\\.[0-9]{1}', x))[[1]],
                                       read.table(x, header=FALSE, fill=TRUE),
                                       stringsAsFactors = FALSE)
                        }
                     })
    
    # COMBINE EACH DATA FRAME INTO ONE
    df <- do.call(rbind, dfList)
    
    # REMOVE PERIOD IN SUBJECT (NEEDED EARLIER FOR SPECIAL DIGIT)
    df['subject'] <- sapply(df['subject'], 
                            function(x) gsub("\\.", "", x))
    

    【讨论】:

    • 这很好用,但是你的最后一行代码并没有摆脱这段时间,有什么想法吗?
    • 太棒了!对于期间,有什么结果呢?请参阅在data.frame() 中使用stringsAsFactors = F 进行编辑,从而避免在sapply 中使用as.character()。如果这不起作用,请查看文件名中是否还有其他句点,其后面只有一位数。
    • 让它工作,超级容易修复非常感谢。只需将其更改为: df$subject
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-02
    相关资源
    最近更新 更多