从r中的文件名中提取文件编号并循环遍历文件

时间:2016-05-10 00:09:47

标签: r for-loop import

我有一个完整的.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):   输入中没有可用的行

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

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

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