1

我喜欢使用plyr,但有时底层数据会引发我无法定位的错误。

例如,我创建了一个求和函数,如果x == 8

df <- data.frame(x = rep(1:10,3), y = runif(30))

ddply(df,
      .(x),
      function (z) { 
        if(z$x[1] == 8) {
          stop("There's an error somewhere.")
        }
        return(sum(z$y))
        })

假装我不知道是什么导致了错误,有什么方法可以报告哪些数据行导致了错误?

4

2 回答 2

4

这是一个使用示例tryCatch

set.seed(1)
df <- data.frame(x = rep(1:10,3), y = runif(30))

f = function (z) { 
        if(z$x[1] == 8) {
          stop("There's an error somewhere.")
        }
        return(sum(z$y))
    }

ddply(df, .(x), function(z) {
         tryCatch(f(z), error = function(e) {
              print("offending block is"); print(z)
         })
     })

#[1] "offending block is"
#  x         y
#1 8 0.6607978
#2 8 0.9919061
#3 8 0.3823880
#Error in list_to_dataframe(res, attr(.data, "split_labels")) : 
#  Results must be all atomic, or all data frames
于 2013-07-12T23:18:22.027 回答
0

使用时,ddply您可以在函数中使用 data.frame 的整个子集df作为变量z。所以,你可以从那里做任何你想做的事情。

z[z$x==8,]

例如,会给你有问题的行。如果您想知道哪个子集引发了错误,您可以执行以下操作:

if (z$x[1] ==8) {
  stop(paste('There is an error in the', unique(z$x), 'subset of df'))
}

否则,您必须更清楚地解释您要查找的内容。包括一组错误的工作示例数据和一个关于您想知道的信息的示例将有很长的路要走……就目前而言,我只是在猜测!

于 2013-07-12T22:17:30.973 回答