Покажите, сколько строк отображается по каждому идентификатору, когда данные не являются панелью (R) - PullRequest
1 голос
/ 03 июля 2019

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

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

В следующем примере я хотел бы объявить столбец Iteration. Пусть группа 1, сформированная клиентами 1 и 2, получит два кредита: Credit_ID 100 на январь 2018 года и Credit_ID 233 на март.

> dt
Client  Group  Credit_ID     Crop  File_origin  Iteration
     1      1        100  2018-01      2018-01          1
     2      1        100  2018-01      2018-01          1
     1      1        100  2018-01      2018-02          1
     2      1        100  2018-01      2018-02          1
     1      1        233  2018-03      2018-03          2
     2      1        233  2018-03      2018-03          2

Как я могу определить столбец Iteration? Я думаю, что ключ должен сосредоточиться на каждом изменении Group и Credit_ID.

Я пытался:

    library(data.table)
    dt[, 1:.N, by = list(Group, Credit_ID)]

Но при этом перечисляется количество строк на группу и номер_кредита.

Ответы [ 2 ]

2 голосов
/ 03 июля 2019

Нам нужно .GRP, чтобы создать групповой индекс вместо 1:.N (который подсчитывает последовательность на группу)

dt[, Iteration := .GRP, by = list(Group, Credit_ID)]

С dplyr мы можем сделать

library(dplyr)
 dt %>%         
     mutate(Iteration = group_indices(,, Group, Credit_ID))
1 голос
/ 03 июля 2019

Одна dplyr возможность может быть:

df %>%
 group_by(Group, Client) %>%
 mutate(Res = cumsum(!duplicated(Credit_ID)))

  Client Group Credit_ID Crop    File_origin Iteration   Res
   <int> <int>     <int> <chr>   <chr>           <int> <int>
1      1     1       100 2018-01 2018-01             1     1
2      2     1       100 2018-01 2018-01             1     1
3      1     1       100 2018-01 2018-02             1     1
4      2     1       100 2018-01 2018-02             1     1
5      1     1       233 2018-03 2018-03             2     2
6      2     1       233 2018-03 2018-03             2     2

Или то же самое с base R:

with(df, ave(Credit_ID, Group, Client, FUN = function(x) cumsum(!duplicated(x))))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...