在R中使用NULL listcolumns进行驱动

时间:2017-02-22 18:25:51

标签: r dplyr purrr

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

对此有什么好的解决方案吗?

1 个答案:

答案 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)