Для полноты (и для дополнения LocoGris 'data.table
answer ) существуют три других подхода, которые обновляют input
по ссылке , т. Е. Без копированиявесь объект данных.
Все подходы возвращают один и тот же результат и могут обрабатывать произвольное количество лет.
Обратите внимание, что id
должен быть уникальным ключом, то есть без каких-либо дубликатов.
Изменение формы, na.omit()
, совокупность
library(data.table)
setDT(input)[, ALL := melt(input, id.var = "id")[, toString(na.omit(value)), by = id]$V1][]
id 2017 2018 2019 ALL
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
Кстати, изменение формы с широкого на длинный формат обеспечивает более краткий способ хранения малонаселенных данных.
melt(input, id.var = "id", na.rm = TRUE)
id variable value
1: aa 2017 tv
2: qq 2017 web
3: ss 2018 web
4: dd 2019 book
5: qq 2019 tv
Изменить, агрегировать, объединить
library(data.table)
setDT(input)[melt(input, id.var = "id", na.rm = TRUE)[, toString(value), by = id],
on = "id", ALL := V1][]
При этом значения NA
удаляются из результата шага изменения формы, который искажаеторигинальный порядок строк из-за множества NA
.Следовательно, требуется обновление соединения .
Filter()
, совокупность
library(data.table)
setDT(input)[, ALL := .SD[, toString(Filter(Negate(is.na), .SD)), by = id]$V1][]