R:如何找到apply产生错误的位置

时间:2013-10-30 18:05:54

标签: r error-handling apply

简单的问题是:如何找到data.frame中应用的位置产生错误?

详情如下:

我有一个数据框架,其中包含野生动物收集的动物的地理数据(纬度/经度)并存储在博物馆中。这些数据来自不同的来源(不同的博物馆和其他博物馆的列表)。动物可能在一个或多个来源中列出,有时我们对同一动物有不同的坐标 - 由于倒圆或拼写错误。我想要的是从每一行获得所有坐标 - 而不是NA - 并计算最大值减去最小值,从而具有误差的大小。小错误可能会被忽略,否则我将不得不检查它们。

我正在使用以下代码:

#ALL is my data.frame with thousands of lines and about 100 columns
#ALL$LatDif will receive the differences in the coordinates for each row
#cLat <- c(18,21,46,54,63,77,85) # the columns with Latitudes from each museum
ALL$LatDif <- apply(ALL,1,function(x) if (any(!is.na(x[cLat]))) {max(x[cLat],na.rm=T)-min(x[cLat],na.rm=T)} else {NA})

应该可以正常工作。但在某种程度上,它说:

Error in max(x[cLat], na.rm = T) - min(x[cLat], na.rm = T) : 
  non-numeric argument to binary operator

traceback()给了我:

2: FUN(newX[, i], ...) at #1
1: apply(TUDO, 1, function(x) if (any(!is.na(x[cLat]))) {
       max(x[cLat], na.rm = T) - min(x[cLat], na.rm = T)
   } else {
       NA
   })

似乎中间有某些字符,但我无法找到。 is.character()没有帮助我。使用a需要花费很长时间。有什么帮助吗?提前谢谢!

2 个答案:

答案 0 :(得分:5)

使用options(error=recover)。这将在遇到错误时启动浏览器会话,并且在该会话中,您可以看到它正在阻塞的变量。当recover要求您选择框架时,请选择最深的框架。然后输入x以查看哪个功能出现问题。

例如:

R> df <-data.frame(a=c('1', '2', '3', "stop('STOP')", '4'))
R> options(error=recover)
R> apply(df, 1, function(x) eval(parse(text=x)))
# Error in eval(expr, envir, enclos) : STOP
# 
# Enter a frame number, or 0 to exit   
# 
# 1: apply(df, 1, function(x) eval(parse(text = x)))
# 2: #1: FUN(newX[, i], ...)
# 3: #1: eval(parse(text = x))
# 4: eval(expr, envir, enclos)
# 
Selection: 4
# Called from: stop("STOP")
Browse[1]> x
#              a 
# "stop('STOP')" 

答案 1 :(得分:1)

查看str(ALL)class(ALL[cLat])。我假设cLat引用的列将为character。但我无法确定,因为您没有提供任何可以重现问题的样本数据。

但是,假设我是对的,你可以通过这样做来理清有问题的值:

ALL[is.na(as.numeric(ALL[cLat])),]