在group_by中调用cor函数时,“标准偏差为零”错误

时间:2018-08-04 05:08:43

标签: r debugging error-handling dplyr try-catch

df <- data.frame(Tag = c(1, 1, 1, 1, 2, 2, 2, 2),
             x = c(9,7,3,2,1,1,1,1),
             y = c(1,2,3,4,1,2,3,4))

cor_fun<- function(x,y){
           val <- cor(x,y)
           return(val)}

df %>%
group_by(Tag) %>%
  summarise(c = cor_fun(x,y))

在这里,我们尝试通过x(Tag)计算ygroup_by之间的相关性。问题在于,当我们计算x&y和的相关性时,任一列标准偏差为0,会吐出误差为 the standard deviation is zero,这在生产中是不可接受的。因此,除了the standard deviation is zero发生时,函数应该返回x的均值,否则应该返回相关输出。我尝试复制下面粘贴的相同场景,请对此进行指导。 使用功能名称cor_fun中的try-catch

简要要求

  1. 在内部函数中,我们可以使用try-catch函数并查找the standard deviation is zero此错误,
  2. 如果the standard deviation is zero发生此错误,函数将返回x的均值。
  3. 如果未发现错误,则返回cor(x,y)输出。

Here the screen shot of error message

预期没有错误消息,而是函数应返回x值的均值。

1 个答案:

答案 0 :(得分:4)

您可以预先计算标准偏差,如果未通过检查,则返回x的平均值。

cor_fun<- function(x,y){

  if (any(sapply(list(x, y), FUN = sd) == 0)) {
    return(mean(x))
  } else {
    val <- cor(x,y)
    return(val)
  }
}

df %>%
  group_by(Tag) %>%
  summarise(c = cor_fun(x,y))

# A tibble: 2 x 2
    Tag      c
  <dbl>  <dbl>
1     1 -0.977
2     2  1 

如果您想走tryCatch路线,可以这样做

cor_fun<- function(x,y){
  val <- tryCatch(cor(x, y), error = function(e) e, warning = function(w) w)
  if (any(class(val) %in% c("simpleWarning", "warning"))) {
    return(mean(x))
  } else {
    return(val)
  }
}

tryCatch计算表达式,在您的情况下为cor(x, y)。如果表达式返回错误或警告,它将将该错误存储在val中,然后继续进行下一行。如果表达式的计算结果符合预期,它将像什么都没发生一样存储在val中。当发生错误或警告时,val的类别与预期的有所不同,例如numericsimpleWarningsimpleError。我用它来捕获表达式的评估是否失败并进行处理。此处理也可以在function(e) e调用中完成。

正在处理tryCatch调用中的警告。

cor_fun<- function(x,y){
  val <- tryCatch(cor(x, y), 
                  error = function(e) e,
                  warning = function(w) {
                    # in case there is a warning (for whatever reason)
                    # return mean of x
                    return(mean(x))
                  })
  val
}

您可以在?tryCatch文档中阅读更多内容,例如here