r - 使用 for 循环时如何在 R 中编写 tryCatch() 函数?
问题描述
我一直在努力在我的代码中编写一个简单的 tryCatch() 。上周我已经问过这个问题(如何在从多个文件中提取数据时编写 tryCatch() 函数?)但无法使其正常工作。我正在处理数千个文件(扩展名为 .MOD),我想从每个文件中提取特定信息。这些信息将被收集到一张 Excel 表格中,每一行代表一个 .MOD 文件。以下是一个 .MOD 文件的示例。
> AR.MOD <- read.table("Sample1ar.MOD", header = FALSE, fill = TRUE)
> AR.MOD
V1 V2 V3 V4 V5 V6 V7 V8
1 Case 1 23-3-2013 14:47:40
2 Run NA
3 R 1 767,96 1647,72 1,78 18,88 0,66 37,33
我已经成功地使用以下代码从每个 .MOD 文件中提取信息:
> AR.MOD.files <- list.files(pattern = "AR.MOD|ar.MOD")
> for (fileName in AR.MOD.files) {
+ 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"
+ if(match(fileName,AR.MOD.files)==1){
+ output.AR.MOD <- AR.MOD.final
+ }else{
+ output.AR.MOD <- rbind(output.AR.MOD,AR.MOD.final)}
+ }
> print(output.AR.MOD)
ID Col1 Col2 Col3 Col4 Col5 Col6 Col7 Col8
1 File1AR.MOD 7-12-2010 14:48:51 574,75 1028,04 2,69 11,68 0,62 37,33
2 File2AR.MOD 22-11-2011 11:43:02 536,15 1033,37 2,54 30,04 0,66 40,33
3 File3AR.MOD 8-11-2011 11:48:20 695,46 1616,14 1,20 35,34 0,65 58,00
4 File4AR.MOD 30-11-2010 12:27:08 825,39 1862,94 1,11 8,43 0,68 54,00
5 File5AR.MOD 25-1-2011 11:33:07 582,52 1205,84 2,03 7,32 0,67 44,00
但是,有时大约有 10-20 个文件(数以万计)不包含所需格式的信息(例如缺少一列 V8),这会导致以下错误并停止脚本。
Error in `[.data.frame`(AR.MOD, c(3), 3:8) : undefined columns selected
因此,我尝试在上述脚本中包含一个 tryCatch() 函数,如下所示,以便脚本仍然可以继续运行。但我无法做到这一点。任何人都可以帮助我更正以下代码,以便在这些特定单元格中将有错误的文件替换为“错误”吗?
AR.MOD.files <- list.files(pattern = "AR.MOD|ar.MOD")
for (fileName in AR.MOD.files) {
tryCatch(
expr = {
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"
if(match(fileName,AR.MOD.files)==1){
output.AR.MOD <- AR.MOD.final
}else{
output.AR.MOD <- rbind(output.AR.MOD,AR.MOD.final)}
}
error = function(e){
message("Error")
print(e)
}
)
}
print(output.AR.MOD)
以下是我想要的,以防任何文件出错:
> print(output.AR.MOD)
ID Col1 Col2 Col3 Col4 Col5 Col6 Col7 Col8
1 File1AR.MOD 7-12-2010 14:48:51 574,75 1028,04 2,69 11,68 0,62 37,33
2 File2AR.MOD 22-11-2011 11:43:02 536,15 1033,37 2,54 30,04 0,66 40,33
3 File3AR.MOD 8-11-2011 11:48:20 Error Error Error Error Error Error
4 File4AR.MOD 30-11-2010 12:27:08 825,39 1862,94 1,11 8,43 0,68 54,00
5 File5AR.MOD 25-1-2011 11:33:07 582,52 1205,84 2,03 7,32 0,67 44,00
解决方案
推荐阅读
- r - 使用 ggridges 在山脊线图中绘制正态分布
- javascript - 如何动态插入到mysql
- python - 如何从 PDF 的每一页中提取同一列上的一组数字?
- php - 如何查询提供类型和 id 的多态 Eloquent 模型?
- sqlalchemy - 与 Graphene-SQLAlchemy 接口类加节点接口的 ID 冲突
- php - Codeigniter 表单验证规则顺序
- php - 仅允许从 WooCommerce 中相同父类别的产品添加到购物车
- javascript - 使用 mocha 在类中测试函数中的变量
- javascript - 如何在使用 JavaScript 的 Google 地图上绘制标记,并将数据保存在 Java 类中?
- python - hyperlink in pandas (dataframe to excel)