我正在研究一种鸟类的生产力数据。我想把配对经验,定义为迄今为止放置的离合器的总数,作为一个变量来调查它是否对生产力有影响。
要做到这一点,我需要计算在当前离合器前每对离合器的总数量。
下面是我正在处理的数据:
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 Series和Count events before a specific time for a series of items in R。
发布于 2020-05-04 18:31:02
我们可以按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"))https://stackoverflow.com/questions/61599145
复制相似问题