Применяйте функции к столбцам списка, которые не являются нулевыми в tibble в R

#r #tidyverse #tidyr #purrr

Вопрос:

У меня есть тиббл, похожий на

 x lt;- tibble(  id = 1:2,  var = list(NULL, tibble(x = c("yes", "no")))  )  

Я хочу применить функции к списку-элементы var , которые не являются пустыми, например

 x %gt;%   mutate(var2 = map_chr(var, ~pull(.x) %gt;%   str_c(., collapse = ";"))  )  

Это, однако, приводит к ошибке, так как pull() не может быть применено к объекту класса «NULL» в первой строке. (Это работает, если я фильтровал раньше, но я не могу удалить случаи, когда var значение равно NULL, так как другие переменные содержат значения для таких случаев).

Я не смог ограничить операцию строками, в которых var значение не равно NULL.

Например, не работает следующее:

 x %gt;%   mutate(  var2 = case_when(  !map_lgl(var, is.null) ~ map_chr(var, ~pull(.x) %gt;%   str_c(., collapse = ";"))))  

Я был бы благодарен за решение.

Ответ №1:

Вот вариант, при котором вы отключаете свой столбец, а затем в группе сворачиваете свою переменную:

 library(dplyr) library(tidyr) library(stringr)  x %gt;%   unnest(var, keep_empty = T) %gt;%  group_by(id) %gt;%   summarize(var2 = str_c(x, collapse = ";"), .groups = "drop")  

Выход

 id var2   lt;intgt; lt;chrgt;  1 1 NA  2 2 yes;no