library(tidyverse)
data(mtcars)
mtcars <- rownames_to_column(mtcars,var = "car")
mtcars$make <- map_chr(mtcars$car,~strsplit(.x," ")[[1]][1])
mt2 <- mtcars %>% select(1:8,make) %>% nest(-make,.key = "l")
mt4<-mt2[1:5,]
mt4[c(1,5),"l"] <- list(list(NULL))
现在,我想为每辆汽车制造以下功能:
fun_mt <- function(df){
a <- df %>%
filter(cyl<8) %>%
arrange(mpg) %>%
slice(1) %>%
select(mpg,disp)
return(a)
}
mt4 %>% mutate(newdf=map(l,~possibly(fun_mt(.x),otherwise = "NA"))) %>% unnest(newdf)
但是,由于
,NULL列拒绝评估Error: no applicable method for 'filter_' applied to an object of class "NULL"
我也尝试过使用安全且可能的方法,但我仍然收到错误信息:
Error: Don't know how to convert NULL into a function
对此有什么好的解决方案吗?
答案 0 :(得分:2)
问题是NULL
被传递到函数fun_mt()
。你想用possibly()
来捕捉这个。但是possibly()
是一个函数运算符,即你传递一个函数并返回一个函数。所以,你的电话应该是
~ possibly(fun_mt, otherwise = "NA"))(.x)
但这不适用于unnest()
。而不是字符"NA"
(无论如何都是一个坏主意,而是使用正确的NA
),您必须默认为数据框:
~ possibly(fun_mt, otherwise = data.frame(mpg = NA, disp = NA))(.x)