Estoy transformando mis datos usando mi propia función de la siguiente manera:

my_df %>% [...] %>%
  mutate(my_result = sapply(id_column, my_function))

Aquí, my_function realizará algunos cálculos para cada fila que devuelva un resultado numérico. La función no se puede vectorizar (fácilmente), por eso confío en sapply. Hasta aquí todo bien.

A veces, my_function lanzará una advertencia, indicando que un resultado específico debe tomarse con cautela.

Me gustaría capturar estas advertencias y agregarlas a mi marco de datos en una nueva columna. Resultado Esperado:

id_column | ... | result | warnings 1 | ... | result1 | NA 2 | ... | result2 | "Warning: something happened on id 2" 3 | ... | result3 | NA

¿Cómo puedo lograrlo?

1
hdkrgr 15 dic. 2016 a las 16:49

2 respuestas

La mejor respuesta

En su lugar, usaría lapply, por lo que puede devolver un data.frame de una fila con dos columnas cada vez y rbind esa lista de marcos de datos nuevamente al final.

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)))
2
mpjdem 15 dic. 2016 a las 14:23

Una alternativa a la respuesta de @ mpjdem pero quedándose con sapply:

tryCatch.W.E devuelve una lista

>> tryCatch.W.E(log(-5))
$value
[1] NaN
$warning
<simpleWarning in log(-5): NaNs produced>

Junto con sapply, esto da como resultado una matriz y la tarea original se puede resolver mediante

my_df %>% cbind(t(sapply(.$id_column, function(x) {tryCatch.W.E(my_function(x))})))

0
hdkrgr 15 dic. 2016 a las 15:12