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