Посчитайте прошлые записи с подобным ключом - PullRequest
0 голосов
/ 28 мая 2018

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

dataset1 = dataset1[,count_IDs := .N,by =  ID]

Однако я хотел бы считать для каждой записи только те, в которых дата этой строки больше.Примерно так: подсчитать все записи с одинаковым идентификатором и иметь дату <= дату текущей строки и добавить столбец с этим значением. </p>

ID | Date   | 
1  | 3/4/10 |
1  | 3/6/10 |
1  | 1/2/10 |
2  | 5/5/10 |
2  | 5/6/10 |

Результат

ID | Date   | Other columns
1  | 3/4/10 | 1
1  | 3/6/10 | 2
1  | 1/2/10 | 0
2  | 5/5/10 | 0
2  | 5/6/10 | 1

Большое спасибо!

Ответы [ 2 ]

0 голосов
/ 28 мая 2018

Выполните самостоятельное объединение в своей таблице, сравнивая каждую строку с каждой другой строкой в ​​группе с помощью .EACHI.Добавление счетчика строк (rn) означает, что вы можете исключить сравнение одной и той же строки и повлиять на ваши результаты:

dat[, rn := .I ]
dat[dat, on="ID", sum(Date <= i.Date & i.rn != rn), .EACHI]

#   ID V1
#1:  1  1
#2:  1  2
#3:  1  0
#4:  2  0
#5:  2  1

Где dat было:

dat <- data.table(ID = c(1, 1, 1, 2, 2), Date = as.Date(c(14672, 
14674, 14611, 14734, 14735), origin = "1970-01-01"))
0 голосов
/ 28 мая 2018

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