Я бы сделал это, используя expand.grid
, чтобы создать фрейм данных со всеми уникальными комбинациями ваших переменных в data
, а затем выполнить более простой for
l oop над последовательностью, представляющей строки в этом фрейме данных. , Итак:
combos <- with(data, expand.grid(id = unique(id), factor = unique(factor)))
empty <- vector(mode = "list", length = nrow(combos))
for (i in seq(nrow(combos))) {
empty[[i]] <- filter(data, id == combos$id[i] & factor == combos$factor[i])
}
, который создает этот список:
> empty
[[1]]
id factor
1 1 A
2 1 A
[[2]]
[1] id factor
<0 rows> (or 0-length row.names)
[[3]]
[1] id factor
<0 rows> (or 0-length row.names)
[[4]]
id factor
1 2 B
Если вы хотите оставить слоты для пустых наборов как NULL
, вы можете поместить шаг фильтрации внутри if
заявление.