добавить строки во фрейм данных для отсутствия наблюдений - PullRequest
0 голосов
/ 17 декабря 2018

У меня есть данные, которые суммируют количество раз, когда птицы наблюдались на месте их размножения по одному в день и каждый час в дневное время (т. Е. Когда солнце было над горизонтом).пример:

head(df)
    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

Однако этот кадр данных не включает часы, когда птица не наблюдалась.Например.нет строки для птицы 19 в день 202 в 14 со значением nObs 0.

Я хотел бы найти способ, предпочтительно с dplyr (аккуратный стих), чтобы добавить в эти строки, когда люди не былинаблюдаемый.

Ответы [ 2 ]

0 голосов
/ 17 декабря 2018

Вы можете использовать complete из tidyr, то есть

library(tidyverse)

df %>% 
 group_by(ID, site) %>% 
 complete(hr = seq(min(hr), max(hr)))

, что дает,

# A tibble: 9 x 5
# Groups:   ID, site [2]
     ID site     hr   day  nObs
  <int> <fct> <int> <int> <int>
1     8 B         8   188     6
2     8 B         9   188     6
3     8 B        10    NA    NA
4     8 B        11   188     7
5    19 A        11   202    60
6    19 A        12    NA    NA
7    19 A        13   202    18
8    19 A        14    NA    NA
9    19 A        15   202    27
0 голосов
/ 17 декабря 2018

Один из способов сделать это - сначала создать «шаблон» из всех возможных комбинаций, в котором можно наблюдать птиц, а затем объединить («левое соединение») фактические наблюдения с этим шаблоном:

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)) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...