Подобные вопросы существуют здесь на SO, но, поскольку вы ищете решение unite
, и я не смог найти ни одного, который бы конкретно использовал unite
, здесь мы go:
Используя unite
input %>% unite(ALL, -id, sep = ", ", remove = FALSE, na.rm = TRUE)
## A tibble: 4 x 5
# id ALL `2017` `2018` `2019`
# <chr> <chr> <chr> <chr> <chr>
#1 aa tv tv NA NA
#2 ss web NA web NA
#3 dd book NA NA book
#4 qq web, tv web NA tv
Чтобы восстановить точный порядок столбцов ожидаемого результата, вы можете добавить %>% select(names(input), ALL)
.
В качестве альтернативы, используя nest
input %>%
group_by(id) %>%
nest() %>%
mutate(ALL = map_chr(data, ~toString(unlist(.x[!is.na(unlist(.x))])))) %>%
unnest(data)
## A tibble: 4 x 5
## Groups: id [4]
# id `2017` `2018` `2019` ALL
# <chr> <chr> <chr> <chr> <chr>
#1 aa tv NA NA tv
#2 ss NA web NA web
#3 dd NA NA book book
#4 qq web NA tv web, tv
Или базовый способ R (как в Как создать новый столбец со всеми не-значениями NA из нескольких других столбцов? ):
input$ALL <- apply(input[, -1], 1, function(x) toString(x[!is.na(x)]))
input
# A tibble: 4 x 5
# id `2017` `2018` `2019` ALL
# <chr> <chr> <chr> <chr> <chr>
#1 aa tv NA NA tv
#2 ss NA web NA web
#3 dd NA NA book book
#4 qq web NA tv web, tv