R语言中批量处理遇到错误的处理方法(1)

在编写R语言函数进行批量处理时,我们常会遇到处理某个数据时出现错误,但是希望(1)跳过该错误继续运行,并且记录错误的具体位置。(2)爬取信息时,对错误的地方忽略错误,继续运行,直到成功为止。

1、编写一个运算的函数,按行处理一个数据框里面的全部数据,计算出结果添加在数据框后面,中途有一行的数据存在问题,忽略错误继续运行完全部结果,将错误的地方填充为NA。

process_data <- function(data_frame, calculation_function) {
  # 创建一个新的矩阵用于存储结果
  result <- matrix(ncol = ncol(data_frame) + 1, nrow = nrow(data_frame))
  colnames(result) <- c(colnames(data_frame), "Result")
  # 迭代处理每行数据
  for (i in 1:nrow(data_frame)) {
    # 捕捉可能出现的错误
    tryCatch({
      # 运行计算函数并将结果存储在结果矩阵中
      result[i, ] <- c(as.character(data_frame[i, ]), calculation_function(as.numeric(data_frame[i, ])))
    }, error = function(e) {
      # 输出错误信息
      cat("Error at row", i, ":", conditionMessage(e), "\n")
      # 将错误的行填充为 NA
      result[i, ] <- c(as.character(data_frame[i, ]), NA)
    })
  }
  # 将结果转换为数据框并返回
  result_df <- as.data.frame(result)
  return(result_df)
}
data<-data.frame(x=c(1,2,3),y=c(3,4,"asd")) 
qwe<-process_data(data,sum)

2、存在错误或警告,继续尝试,中途每次停三秒,输出尝试次数。

process_data <- function(data_frame, calculation_function) {
  # 创建一个新的矩阵用于存储结果
  result <- matrix(ncol = ncol(data_frame) + 1, nrow = nrow(data_frame))
  colnames(result) <- c(colnames(data_frame), "Result")
  
  # 迭代处理每行数据
  for (i in 1:nrow(data_frame)) {
    # 定义尝试次数、最大尝试次数和延迟时间
    attempts <- 0
    max_attempts <- 3
    delay <- 3
    
    # 进行尝试
    while (attempts < max_attempts) {
      tryCatch({
        # 运行计算函数并将结果存储在结果矩阵中
        result[i, ] <- c(as.character(data_frame[i, ]), calculation_function(as.numeric(data_frame[i, ])))
        # 如果成功运行计算函数,则跳出尝试循环
        break
      }, error = function(e) {
        # 输出错误信息和尝试次数
        cat("Error at row", i, ":", conditionMessage(e), "\n")
        # 延迟一定时间后再次尝试
        Sys.sleep(delay)
      }, warning = function(w) {
        # 输出警告信息和尝试次数
        cat("Warning at row", i, ":", conditionMessage(w), "\n")
        # 延迟一定时间后再次尝试
        Sys.sleep(delay)
      })
      
      # 尝试次数+1
      attempts <- attempts + 1
    }
    
    # 如果仍然出现错误,则将错误的行填充为NA
    if (attempts == max_attempts && is.na(result[i, "Result"])) {
      result[i, ] <- c(as.character(data_frame[i, ]), NA)
    }
  }
  
  # 将结果转换为数据框并返回
  result_df <- as.data.frame(result)
  return(result_df)
}

data <- data.frame(x = c(1, 2, 3), y = c(3, 4, "asd"))
qwe <- process_data(data, sum)

通过上述示例,不难发现主要用到了tryCatch、for和while。实际情况需要灵活处理。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值