Вот решение dplyr
.Сначала я создал фрейм данных из ваших данных.Обратите внимание, что оба типа символов:
> library(dplyr)
> library(magrittr)
> library(lubridate)
> df <- as.tibble(cbind(identifier,date=date))
> df
# A tibble: 5 x 2
identifier date
<chr> <chr>
1 1 3/4/10
2 1 3/6/10
3 1 1/2/10
4 2 5/5/10
5 2 5/6/10
Я создаю пару промежуточных столбцов с mutate
, а затем опускаю их в конце:
> df %>% group_by(identifier) %>% add_tally() %>% mutate(d=mdy(date)) %>%
mutate(timeorder=order(d < max(d))) %>%
mutate(numprev=n-timeorder) %>% select(identifier,date,numprev)
# A tibble: 5 x 3
# Groups: identifier [2]
identifier date numprev
<chr> <chr> <int>
1 1 3/4/10 1
2 1 3/6/10 2
3 1 1/2/10 0
4 2 5/5/10 0
5 2 5/6/10 1
Вы можете увидеть промежуточные шагиопустив последний select
:
> df %>% group_by(identifier) %>% add_tally() %>% mutate(d=mdy(date)) %>%
mutate(timeorder=order(d < max(d))) %>% mutate(numprev=n-timeorder)
# A tibble: 5 x 6
# Groups: identifier [2]
identifier date n d timeorder numprev
<chr> <chr> <int> <date> <int> <int>
1 1 3/4/10 3 2010-03-04 2 1
2 1 3/6/10 3 2010-03-06 1 2
3 1 1/2/10 3 2010-01-02 3 0
4 2 5/5/10 2 2010-05-05 2 0
5 2 5/6/10 2 2010-05-06 1 1