我正在处理我在数据框中收集的一些数据,我想在其中将函数应用于列的所有元素。通常我用purrr::map()
这个。但是,如果函数为列的元素之一返回错误,有时这将不起作用:
f <- function(x) {
if(x==2) stop("I hate 2") else x
}
library(dplyr)
dd <- data.frame(x = c(1:2))
dd2 <- dd %>%
mutate(fx = purrr::map(.x = x, .f = ~f(.)))
Error: I hate 2
所以我可以用 包装我的函数f
,try()
并获得一列结果:
> dd2 <- dd %>%
+ mutate(fx = purrr::map(.x = x, .f = ~try(f(.))))
Error in f(.) : I hate 2
> dd2
x fx
1 1 1
2 2 Error in f(.) : I hate 2\n
现在,我理想情况下想用它filter()
来过滤掉有错误的行,但我似乎无法做到这一点。这些都不会产生只有第一行的数据框:
dd2 %>% filter(is.integer(fx) )
dd2 %>% filter(is.integer(.$fx) )
dd2 %>% filter(class(fx) != "try-error")
dd2 %>% filter(class(.$fx) != "try-error")
lapply(dd2, is.numeric)
我正在考虑的一个肮脏的技巧是try_catch()
改用它,并使其返回与f()
错误情况相同类型的对象,例如-99999
此处,然后将其过滤掉,但我正在寻找更清洁的解决方案。