Один из способов сделать это - сначала создать «шаблон» из всех возможных комбинаций, в котором можно наблюдать птиц, а затем объединить («левое соединение») фактические наблюдения с этим шаблоном:
a = read.table(text = " ID site day hr nObs
1 19 A 202 11 60
2 19 A 202 13 18
3 19 A 202 15 27
4 8 B 188 8 6
5 8 B 188 9 6
6 8 B 188 11 7")
tpl <- expand.grid(c(unique(a[, 1:3]), list(hr = 1:24)))
merge(tpl, a, all.x = TRUE)
Редактирование на основе комментария @ user3220999: в случае, если мы хотим выполнить процесс в ID
, мы можем просто использовать split
, чтобы получить список data.frames для идентификатора, получить список шаблонов и mapply
объединитьв двух списках:
a <- split(a, a$ID)
tpl <- lapply(a, function(ai) {
expand.grid(c(unique(ai[, 1:3]), list(hr = 1:24)))
})
res <- mapply(merge, tpl, a, SIMPLIFY = FALSE, MoreArgs = list(all.x = TRUE))