【问题标题】:add rows to data frame for non-observations将行添加到数据框以进行非观察
【发布时间】:2019-05-17 23:13:10
【问题描述】:

我有一个数据框,它总结了白天(即太阳在地平线以上时)每天和每小时在其繁殖地观察到一只鸟的次数。示例:

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

但是,此数据框不包括未观察到这只鸟的时间。例如。第 202 天第 14 天的鸟 19 没有行,nObs 值为 0。

我想找到一种方法,最好是使用 dplyr(整洁的诗句),在没有观察到个人时添加这些行。

【问题讨论】:

标签: r dplyr


【解决方案1】:

做到这一点的一种方法是首先构建一个可以观察鸟类的所有可能组合的“模板”,然后将实际观察结果合并(“左连接”)到该模板上:

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 来获取每个ID 的data.frames 列表,获取模板列表和@987654324 @合并两个列表:

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)) 

【讨论】:

  • 我确实考虑过这一点,但我们的采样在 3 个月的季节中变化很大,因此可能必须针对每个人进行定制。
  • 我编辑了我的答案以适用于每个 ID,我们当然可以对不同的拆分做类似的方法。
【解决方案2】:

您可以从tidyr 使用complete,即

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

【讨论】:

  • df %&gt;% group_by(ID, site, day) %&gt;% complete(hr = seq(min(hr), max(hr)), fill = list(nObs = 0)) 可能更符合潜在的预期输出(当然我们无法知道这一点)。
  • 感谢@arg0naut,您的添加可以完美地将所有 NA 替换为 0。
猜你喜欢
  • 2023-02-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-03
  • 2017-04-06
  • 1970-01-01
相关资源
最近更新 更多