我正在使用我自己的函数转换数据,如下所示:
my_df %>% [...] %>%
mutate(my_result = sapply(id_column, my_function))
这里,my_function
将为返回数字结果的每一行执行一些计算。这个函数不能(很容易)被矢量化,这就是我依赖sapply的原因。到目前为止,非常好。
有时候,my_function
会发出警告,表示应该采取一些特定的结果。
我想捕获这些警告,并将它们添加到我的数据框中的新列中。预期结果:
id_column | ... | result | warnings
1 | ... | result1 | NA
2 | ... | result2 | "Warning: something happened on id 2"
3 | ... | result3 | NA
我怎样才能做到这一点?
答案 0 :(得分:2)
我改为使用lapply
,因此您可以返回一行data.frame
,每次有两列,最后再次rbind
数据帧列表。
df <- data.frame(a=runif(20)-0.5)
f <- function(x) {
tryCatch ({
data.frame(result=log(x), warning=NA)
}, warning = function(w) {
data.frame(result=suppressWarnings(log(x)), warning=w$message)
})
}
res <- cbind(df, do.call(rbind, lapply(df$a, f)))
答案 1 :(得分:0)
替代@ mpjdem的答案,但留在sapply
:
tryCatch.W.E
返回一个列表
>> tryCatch.W.E(log(-5))
$value
[1] NaN
$warning
<simpleWarning in log(-5): NaNs produced>
结合sapply
,这会产生一个矩阵,原始任务可以通过
my_df %>% cbind(t(sapply(.$id_column, function(x) {tryCatch.W.E(my_function(x))})))