【问题标题】:r: Retaining warnings in `sapply` loop as a vectorr:在 `sapply` 循环中保留警告作为向量
【发布时间】:2016-12-15 13:49:11
【问题描述】:

我正在使用我自己的函数转换我的数据,如下所示:

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

我怎样才能做到这一点?

【问题讨论】:

  • 使用tryCatch。我会向您展示详细信息,但这里没有可重复的示例,而且我不会说脏话。
  • 谢谢,研究一下这个问题,我会将其扩展为原始问题的答案。

标签: r dplyr warnings sapply


【解决方案1】:

我会改用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)))

【讨论】:

    【解决方案2】:

    @mpjdem 的答案的替代方案,但与 sapply 保持一致:

    tryCatch.W.E 返回一个列表

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

    结合sapplythis 产生一个矩阵,原始任务可以通过解决

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

    【讨论】:

      猜你喜欢
      • 2015-11-09
      • 1970-01-01
      • 2013-11-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多