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)计算y
和group_by
之间的相关性。问题在于,当我们计算x&y和的相关性时,任一列标准偏差为0,会吐出误差为
the standard deviation is zero
,这在生产中是不可接受的。因此,除了the standard deviation is zero
发生时,函数应该返回x的均值,否则应该返回相关输出。我尝试复制下面粘贴的相同场景,请对此进行指导。
使用功能名称cor_fun
中的try-catch 。
简要要求
the standard deviation is zero
此错误,the standard deviation is zero
发生此错误,函数将返回x的均值。cor(x,y)
输出。 预期没有错误消息,而是函数应返回x值的均值。
答案 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
的类别与预期的有所不同,例如numeric
至simpleWarning
或simpleError
。我用它来捕获表达式的评估是否失败并进行处理。此处理也可以在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。