【问题标题】:Rolling count of events by group over time in RR中随时间按组滚动的事件计数
【发布时间】:2020-05-04 18:29:46
【问题描述】:

我正在处理一种鸟类的生产力数据。我想将配对经验(定义为迄今为止铺设的离合器总数)作为一个变量来研究它是否对生产力有影响。

为此,我需要计算每对在当前离合器之前放置的离合器总数。

这是我正在处理的数据:

   Pair.ID    laydate
1  GGM 022       <NA>
2  GGM 022       <NA>
3  GGM 022       <NA>
4  GGM 019 26/03/2017
5  GGM 019       <NA>
6  GGM 019       <NA>
7  GGM 013 18/03/2017
8  GGM 021       <NA>
9  GGM 021       <NA>
10 GGM 021       <NA>
11 GGM 009 25/12/2016
12 GGM 009 14/01/2019
13 GGM 009 20/01/2019
14 GGM 029       <NA>
15 GGM 031 09/05/2019
16 GGM 031 19/06/2019

这是我想要达到的目的:

   Pair.ID    laydate experience
1  GGM 022       <NA>         NA
2  GGM 022       <NA>         NA
3  GGM 022       <NA>         NA
4  GGM 019 26/03/2017          0
5  GGM 019       <NA>         NA
6  GGM 019       <NA>         NA
7  GGM 013 18/03/2017          0
8  GGM 021       <NA>         NA
9  GGM 021       <NA>         NA
10 GGM 021       <NA>         NA
11 GGM 009 25/12/2016          0
12 GGM 009 14/01/2019          1
13 GGM 009 20/01/2019          2
14 GGM 029       <NA>         NA
15 GGM 031 09/05/2019          0
16 GGM 031 19/06/2019          1

有几点: 1)我需要保留带有 NA 的行,因为它们是配对有机会繁殖但没有繁殖的地方。 2)我想将信息添加到母数据框中,而不是创建摘要数据框。 3) 如果可能,我想使用 dplyr

我环顾四周,试图找出这些解决方案来满足我的目的,但无法让它们按需要工作: Rolling Count of Events Over Time SeriesCount events before a specific time for a series of items in R

【问题讨论】:

  • 如果您可以将数据显示为data.frame 对象而不是表格,这将有助于您的问题可重现。

标签: r dplyr


【解决方案1】:

我们可以按 Pair.ID 分组,在 i 中指定逻辑向量,即“laydate”中的任何非 NA 元素,并通过分配 (:=) 行序列来创建新列“体验”

library(data.table)
setDT(df1)[!is.na(laydate), experience := seq_len(.N) - 1, Pair.ID][]
#    Pair.ID    laydate experience
# 1: GGM 022       <NA>         NA
# 2: GGM 022       <NA>         NA
# 3: GGM 022       <NA>         NA
# 4: GGM 019 26/03/2017          0
# 5: GGM 019       <NA>         NA
# 6: GGM 019       <NA>         NA
# 7: GGM 013 18/03/2017          0
# 8: GGM 021       <NA>         NA
# 9: GGM 021       <NA>         NA
#10: GGM 021       <NA>         NA
#11: GGM 009 25/12/2016          0
#12: GGM 009 14/01/2019          1
#13: GGM 009 20/01/2019          2
#14: GGM 029       <NA>         NA
#15: GGM 031 09/05/2019          0
#16: GGM 031 19/06/2019          1

dplyr

library(dplyr)
df1 %>%
  group_by(Pair.ID) %>%
  mutate(experience = (row_number()-1) * (NA^(is.na(laydate))))

数据

df1 <- structure(list(Pair.ID = c("GGM 022", "GGM 022", "GGM 022", "GGM 019", 
"GGM 019", "GGM 019", "GGM 013", "GGM 021", "GGM 021", "GGM 021", 
"GGM 009", "GGM 009", "GGM 009", "GGM 029", "GGM 031", "GGM 031"
), laydate = c(NA, NA, NA, "26/03/2017", NA, NA, "18/03/2017", 
NA, NA, NA, "25/12/2016", "14/01/2019", "20/01/2019", NA, "09/05/2019", 
"19/06/2019")), class = "data.frame", row.names = c("1", "2", 
"3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", 
"15", "16"))

【讨论】:

  • 太棒了!非常感谢,按我的意愿工作。我知道它应该只需要几行代码。干杯
猜你喜欢
  • 1970-01-01
  • 2021-09-14
  • 1970-01-01
  • 2023-03-26
  • 2021-05-21
  • 1970-01-01
  • 2021-09-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多