【发布时间】:2017-02-16 18:02:54
【问题描述】:
当在dplyr 类型链中使用group_by 时,如何找出哪个组失败了。举个例子:
library(dplyr)
data(iris)
iris %>%
group_by(Species) %>%
do(mod=lm(Petal.Length ~ Petal.Width, data = .)) %>%
mutate(Slope = summary(mod)$coeff[2])
工作正常。现在如果我添加一些问题数据到iris:
iris$Petal.Width[iris$Species=="versicolor"]= NA
这样在尝试运行线性模型时会失败:
iris_sub <- iris[iris$Species=="versicolor",]
lm(Petal.Length ~ Petal.Width, data = iris_sub)
但是,如果我在运行这个时使用大量数据集接近这个盲人:
iris %>%
group_by(Species) %>%
do(mod=lm(Petal.Length ~ Petal.Width, data = .)) %>%
mutate(Slope = summary(mod)$coeff[2])
此错误消息无法帮助我找到模型在哪个级别失败:
lm.fit 中的错误(x,y,偏移量 = 偏移量,奇异值.ok = 奇异值.ok,...) : 0 (non-NA) 案例
我可以使用如下所示的循环。这至少让我知道函数在哪个级别的Species 上失败。但是,我更喜欢使用 dplyr 设置:
lmdf <- c()
for (i in unique(iris$Species)) {
cat(i, "\n")
u <- iris %>%
filter(Species==i) %>%
do(mod=lm(Petal.Length ~ Petal.Width, data = .))
lmdf = rbind(lmdf, u)
}
关于实现这一目标的更好方法的任何建议?总而言之,我正在尝试使用dplyr 类型框架来确定在哪个组级别,函数失败。
引用here 的tryCatch 解决方案似乎不再有效。我收到此错误:
tryCatch 中的错误(lm(v3 ~ v4, df), error = if (e$message == all_na_msg) default else stop(e)) : object 'e' not found
【问题讨论】:
-
非常接近。 catch NAs using linear model with dplyr 的可能重复项
-
我觉得我可能有点歪曲了这个问题。 lm() 可以是任何失败的函数。我要做的是确定 do() 调用的函数在哪个组(或组组合)失败。
-
@Axeman - 我对 purrr 的例子很感兴趣。但是我不确定如何处理由
safe_lm. For example::safe_lm safe_lm(Petal.Length ~ Petal.Width, data = iris_sub) 输出一个列表。如何将其合并到我的链中iris %> group_by(Species) %>% do(safe_lm(.))?