#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