2017-02-22 7 views
1
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)) 

Теперь, я бы хотел, чтобы запустить следующую функцию для каждого марки автомобиля:purrring с NULL listcolumns в R

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

Почему вы используете 'NULL' вообще? Что означает «NULL»? Можете ли вы использовать 'NA' вместо этого? – Gregor

+0

@gregor В конечном итоге я получаю NULL в следующем наборе данных после использования left_joins в двух разных списках. Я не думаю, что могу принудить left_join к NA вместо Misha

ответ

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) 
+0

@Maximillian Girlich - Thx. Но знаете ли вы, почему я не получаю listcol обратно, когда я делаю 'm <-mt4 [1: 5,]%>% mutate (newdf = map_df (l, ~ .x%>% {ifelse (is. null (.x), yes = as_tibble (NULL), no = fun_mt (.x))})) ' – Misha

Смежные вопросы