从多个文件提取数据时,如何编写tryCatch()函数?
我目前正在处理数千个文件(扩展名为.MOD),希望从这些文件中提取特定信息。然后,这些信息将被收集到一个excel工作表中,每一行表示从一个.MOD文件中提取的信息。我设法做到了这一点 但是,有大约10-20个文件(成千上万个文件中)不包含我想要的格式的信息,因此会抛出一个错误。当然,我不能手动继续挖掘所有文件,也不能每次都对它们进行子集划分,以找出哪些文件抛出了错误。因此,我希望包含一个tryCatch()函数,这样脚本仍然可以继续运行而不停止。对于给出错误的文件,我只希望这些特定单元格中的值替换为“error”。有人能帮我怎么做吗 以下是我希望最终excel输出的样子:从多个文件提取数据时,如何编写tryCatch()函数?,r,try-catch,R,Try Catch,我目前正在处理数千个文件(扩展名为.MOD),希望从这些文件中提取特定信息。然后,这些信息将被收集到一个excel工作表中,每一行表示从一个.MOD文件中提取的信息。我设法做到了这一点 但是,有大约10-20个文件(成千上万个文件中)不包含我想要的格式的信息,因此会抛出一个错误。当然,我不能手动继续挖掘所有文件,也不能每次都对它们进行子集划分,以找出哪些文件抛出了错误。因此,我希望包含一个tryCatch()函数,这样脚本仍然可以继续运行而不停止。对于给出错误的文件,我只希望这些特定单元格中的值
ID COL1 COL2 COL3 COL4 COL5 COL6 COL7 COL8
Sample1 9-5-2014 10:42:41 600 1207 3 2 62 30
Sample2 8-1-2013 08:44:50 654 1873 1 7 60 45
Sample3 2-3-2013 14:47:40 767 1645 1 18 66 37
Sample4 8-2-2013 08:50:45 727 1500 1 8 68 45
Sample5 4-1-2013 13:08:49 Error Error Error Error Error Error
Sample6 1-2-2013 13:08:47 720 1433 1 16 60 51
Sample7 3-4-2013 13:59:04 610 1343 2 13 66 32
以下是我的代码(以及错误):
AR.MOD.files我将响应lappy
解决方案,在单个列表元素中创建表,然后处理组合。下面是一个使用data.table
包的示例,该包在找不到NA的地方用NA填充数据:
# # for installing:
# install.packages(data.table)
library(data.table)
# generate tables with uneven columns
set.seed(1)
tables <- lapply(1:10, function(i){
ncols <- sample(1:5, 1, 1)
out <- as.data.frame(matrix(runif(ncols), nrow=1, ncol=ncols))
})
# you can use rbindlist with fill=TRUE to fill the bad values with NA
output <- as.data.frame(rbindlist(tables, fill=TRUE))
##用于安装:
#install.packages(data.table)
库(数据表)
#生成列不均匀的表
种子(1)
tables我将响应lappy
解决方案,在单个列表元素中创建表,然后处理组合。下面是一个使用data.table
包的示例,该包在找不到NA的地方用NA填充数据:
# # for installing:
# install.packages(data.table)
library(data.table)
# generate tables with uneven columns
set.seed(1)
tables <- lapply(1:10, function(i){
ncols <- sample(1:5, 1, 1)
out <- as.data.frame(matrix(runif(ncols), nrow=1, ncol=ncols))
})
# you can use rbindlist with fill=TRUE to fill the bad values with NA
output <- as.data.frame(rbindlist(tables, fill=TRUE))
##用于安装:
#install.packages(data.table)
库(数据表)
#生成列不均匀的表
种子(1)
表这里有一种方法
writeLines(“a,b\n1,2”,“Letin\u good.csv”)
writeLines(“,“Letin_bad1.csv”)
writeLines(“c,d\n3,4”,“Letin_bad2.csv”)
#myfiles这里有一个方法
writeLines(“a,b\n1,2”,“Letin\u good.csv”)
writeLines(“,“Letin_bad1.csv”)
writeLines(“c,d\n3,4”,“Letin_bad2.csv”)
#myfiles您的错误具体发生在哪里?我不清楚流程在哪一点产生错误。然而。。。强烈建议您不要反复使用rbind
,它的性能会非常差,如果您有10k文件,您会很快知道(并等待很长时间)。建议将其包装在lappy
中,然后执行一次:do.call(rbind.data.frame,框架列表)
。这也可能有助于解决您的一些错误文件问题。感谢您让我了解rbind。我会努力的。关于错误,它正好显示在我在代码中显示的步骤之后。但是它可能来自这里“AR.MOD.subset2您的错误到底发生在哪里?我不清楚该过程在哪一点产生错误。但是…强烈建议您不要反复使用rbind
,它的性能将非常差,如果您有10k文件,您将很快知道(并等待很长时间).建议将其包装在lappy
中,然后执行一次:do.call(rbind.data.frame,列出所有帧)
。这也可能有助于解决您的一些错误文件问题。感谢您让我知道rbind。我会处理这个问题。关于错误,它正好显示在我在代码中显示的步骤之后。但是如果用户不需要数据,它可能来自这里的“AR.MOD.subset2”
用于其他部分,然后可以将rbindlist
替换为do.call(rbind.data.frame,tables)
。这是由于列不匹配而导致的错误。它的参数是否类似于rbindlist
中的fill
?其他选择。编辑:它现在有点老了,它的dplyr
现在不是顶部的plyr
solution@Jonny:您能用我的完整代码实现您的代码吗?这样我就可以按原样尝试,而不是犯错误?此外,是否可以添加除NA以外的其他内容(可能是“错误”)?由于其他原因,excel文件中确实存在NAs。这就是为什么我想把这些和其他名字分开,以便知道这是由于错误。是的,当然,编辑了我的答案。啊,等等,刚刚看到你的意思,忽略我的编辑如果用户不需要数据。对于其他部分,则rbindlist
可以替换为do.call(rbind.data.frame,tables)
。这对我来说是由于列不匹配造成的错误。它的参数是否类似于rbindlist
中的fill
?其他选择。编辑:它现在有点老了,它的dplyr
现在不是顶部的plyr
solution@Jonny:您能用我的完整代码实现您的代码吗?这样我就可以按原样尝试,而不是犯错误?此外,是否可以添加除NA以外的其他内容(可能是“错误”)?由于其他原因,excel文件中确实存在NAs。这就是为什么我想把这些和其他名字分开,以便知道这是由于错误。是的,当然,编辑了我的答案。啊,等等,刚刚明白你的意思,忽略我的编辑
> AR.MOD <- read.table("Sample3AR.MOD", header = FALSE, fill = TRUE)
> AR.MOD
V1 V2 V3 V4 V5 V6 V7
1 Case 1 28-1-2013 8:44:50
2 Run NA
3 R 1 783,76 1873,70 1,34 7,48 0,60
# # for installing:
# install.packages(data.table)
library(data.table)
# generate tables with uneven columns
set.seed(1)
tables <- lapply(1:10, function(i){
ncols <- sample(1:5, 1, 1)
out <- as.data.frame(matrix(runif(ncols), nrow=1, ncol=ncols))
})
# you can use rbindlist with fill=TRUE to fill the bad values with NA
output <- as.data.frame(rbindlist(tables, fill=TRUE))
# # for installing:
# install.packages(data.table)
library(data.table)
# Set this to what you expect max to be
ncol_total <- 9
tables <- lapply(AR.MOD.files, function(fileName){
AR.MOD <- read.table(fileName, header = FALSE, fill = TRUE)
AR.MOD.subset1 <- AR.MOD[c(1), 3:4]
names(AR.MOD.subset1) <- c("COL1", "COL2")
AR.MOD.subset2 <- AR.MOD[c(3), 3:8]
names(AR.MOD.subset2) <- c("COL3", "COL4", "COL5", "COL6", "COL7", "COL8")
AR.MOD.final <- merge(AR.MOD.subset1, AR.MOD.subset2)
ID <- basename(fileName)
AR.MOD.final <- merge (ID, AR.MOD.final)
colnames(AR.MOD.final)[colnames(AR.MOD.final)=="x"] <- "ID"
# add in missing data
ncol_file <- ncol(AR.MOD.final)
missing <- ncol_total - ncol_file
if(missing > 0){
new_data <- as.data.frame(matrix("Error", nrow=nrow(AR.MOD.final), ncol=missing))
AR.MOD.final <- cbind(AR.MOD.final, AR.MOD.final)
}
AR.MOD.final
})
# this will likely screw up the column names. Its better to know what these
# are and assign after, as long as the tables are all in the same order
output <- as.data.frame(rbindlist(tables, use.names = FALSE))
names(output) <- c("ID", "COL1", "COL2", "COL3", "COL4", "COL5", "COL6", "COL7"
"COL8")
# continuing on
output$ID <- gsub("AR.MOD", "", paste(output$ID))
output$ID <- gsub("ar.MOD", "", paste(output$ID))
print(output)