【问题标题】:Is there an equivalent of plyr's .inform in dplyr?dplyr 中是否有相当于 plyr 的 .inform 的东西?
【发布时间】:2015-12-11 08:50:40
【问题描述】:

plyr 有一个非常方便的选项,.inform = TRUE,它可以让用户知道 split-apply-combine 过程中的哪些部分失败。

有没有等效的方法来知道哪个部分因dplyrgroup_by 而失败?

一个最简单的例子:以下df 中的组1 是导致问题的组,但dplyr 错误消息没有显示该信息。

df <- data.frame(group = c(1, 1, 2, 2, 2))
df %>% group_by(group) %>% mutate(value = c(10, 10, 10))
# Error: incompatible size (3), expecting 2 (the group size) or 1

【问题讨论】:

  • 查看?group_by 的帮助文件,没有迹象表明存在这样的选项(而它记录在?plyr::ddply 中),直到现在我还没有看到它在任何地方使用。但是,我假设您得到的错误会让您知道它是在 mutatesummarisefilter... 还是在 group_by 操作之后的其他 dplyr 函数中。也许您可以举一个不清楚的例子?
  • 我添加了一个最小的例子。
  • 在您的示例中,第一组的大小为 2 (1, 1) 但您尝试在 mutate 调用中创建一个具有 3 个值 (=rows) 的新列,这在 dplyr 中是不可能的-世界。这个例子是不是你不清楚的案例?
  • 我构造了这个例子,所以它失败了。这个例子的重点是表明dplyr 没有告诉我们哪个组失败了。相反,如果我尝试使用 plyr.inform = TRUE 进行类似操作,plyr 会告诉我是第 1 组导致失败。在实际应用中,看不到哪个组失败了,所以.inform = TRUE很有价值。
  • 我明白你的意思。正如我所说,我不知道目前在 dplyr(CRAN 版本)中实现的此类功能

标签: r dplyr plyr


【解决方案1】:

我不知道dplyr 中的方法,因此这可能与您正在寻找的内容有些正交,但这是使用splitpurrr::possibly 的潜在方法。

library(purrr); library(dplyr)

set_3_tens <- function(df) { df %>% mutate(value = c(10,10,10)) }

df %>%
  split(.$group) %>%
  map(
    possibly(
      set_3_tens, otherwise = "Problem in group"))

$`1`
[1] "Problem in group"

$`2`
  group value
1     2    10
2     2    10
3     2    10

【讨论】:

  • 这个解决方案确实解决了我的根本问题,即如何在函数式编程框架中进行调试。我想出的另一个解决方案是在被映射的函数中包含一个 tryCatch 块。这样,当遇到错误时,我可以选择如何处理它(例如打印出错误消息,打印出该片段中的数据)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-11-18
  • 2016-06-03
  • 2011-06-19
  • 1970-01-01
  • 2014-05-27
  • 2011-04-20
  • 2019-12-24
相关资源
最近更新 更多