Скользящий подсчет событий по группам по времени в R - PullRequest
1 голос
/ 04 мая 2020

Я работаю с данными о продуктивности видов птиц. Я хотел бы включить опыт пары, определяемый как общее количество сцеплений, заложенных на сегодняшний день, в качестве переменной, чтобы исследовать, влияет ли это на производительность.

Для этого мне нужно подсчитать общее количество сцеплений, заложенных перед текущим сцеплением для каждой пары.

Вот данные, с которыми я работаю:

   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, если это возможно

Я осмотрелся и попытался привести в соответствие эти решения в соответствии с моими целями, но не смог заставить их работать по мере необходимости: Скользящее число событий во временных рядах и Подсчет событий до заданного времени c для серии элементов в R

1 Ответ

1 голос
/ 04 мая 2020

Мы можем сгруппировать по Pair.ID, указать логический вектор в i, т. Е. Там, где есть не-NA элементы в «laydate», и создать новый столбец «опыт», задав (:=) последовательность строк

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

data

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