从多个文件提取数据时,如何编写tryCatch()函数?

从多个文件提取数据时,如何编写tryCatch()函数?,r,try-catch,R,Try Catch,我目前正在处理数千个文件(扩展名为.MOD),希望从这些文件中提取特定信息。然后,这些信息将被收集到一个excel工作表中,每一行表示从一个.MOD文件中提取的信息。我设法做到了这一点 但是,有大约10-20个文件(成千上万个文件中)不包含我想要的格式的信息,因此会抛出一个错误。当然,我不能手动继续挖掘所有文件,也不能每次都对它们进行子集划分,以找出哪些文件抛出了错误。因此,我希望包含一个tryCatch()函数,这样脚本仍然可以继续运行而不停止。对于给出错误的文件,我只希望这些特定单元格中的值

我目前正在处理数千个文件(扩展名为.MOD),希望从这些文件中提取特定信息。然后,这些信息将被收集到一个excel工作表中,每一行表示从一个.MOD文件中提取的信息。我设法做到了这一点

但是,有大约10-20个文件(成千上万个文件中)不包含我想要的格式的信息,因此会抛出一个错误。当然,我不能手动继续挖掘所有文件,也不能每次都对它们进行子集划分,以找出哪些文件抛出了错误。因此,我希望包含一个tryCatch()函数,这样脚本仍然可以继续运行而不停止。对于给出错误的文件,我只希望这些特定单元格中的值替换为“error”。有人能帮我怎么做吗

以下是我希望最终excel输出的样子:

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)