2

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

详情如下:

我有一个 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() 没有帮助我。使用 for 需要很长时间。请问有什么帮助吗?提前致谢!

4

2 回答 2

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')" 
于 2013-10-30T18:15:44.770 回答
1

看看str(ALL)或只是class(ALL[cLat])。我假设所引用的列cLat将是character. 但我不能确定,因为您没有提供任何重现您的问题的示例数据。

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

ALL[is.na(as.numeric(ALL[cLat])),]
于 2013-10-30T18:09:35.090 回答