Как сопоставить данные в разных столбцах в R? - PullRequest
0 голосов
/ 20 апреля 2020

У меня упрощенный набор данных, как показано ниже: есть несколько клиентов, и у каждого КЛИЕНТА может быть несколько займов. CUSTOMER не менее 1 LOAN_DEFAULT помечен как CUSTOMER_DEFAULT, а DEFAULT_DATE - первый раз по умолчанию.

CUSTOMER LOAN   DATE    AMOUNT LOAN_DEFAULT CUSTOMER_DEFAULT DEFAULT_DATE CLASSIFICATION
1        101   201601    100    Y               Y            201501          S
1        102   201603    100    N               Y            201501          S
1        103   201501    100    Y               Y            201501          S
1        104   201501    200    N               Y            201501          S
2        201   201601    100    N               N               -            M
2        202   201603    100    N               N               -            M
  1. Как рассчитать сумму кредита для клиент на первую дату по умолчанию, например, 201501 для клиента 1, который равен общей сумме AMOUNT в этом месяце, что я должен получить число 300? То, о чем я думаю, это сравнить DATE и DEFAULT_DATE и, если они совпадают, использовать функцию суммы. Но мой код не работал.
  2. Я хочу суммировать количество клиентов по умолчанию по классификации, но, используя функцию суммирования, кажется, что она не работает должным образом?

Ответы [ 3 ]

2 голосов
/ 20 апреля 2020

Мы можем суммировать AMOUNT значение, где DATE равно first DEFAULT_DATE для каждого CUSTOMER.

library(dplyr)

df %>% 
  group_by(CUSTOMER) %>% 
  summarise(total_sum  = sum(AMOUNT[DATE == first(DEFAULT_DATE)]))

#   CUSTOMER total_sum
#     <int>     <int>
#1        1       300
#2        2         0

Чтобы получить количество клиентов по умолчанию для каждого CLASSIFICATION, мы можем сделать:

df %>%
  group_by(CLASSIFICATION) %>%
  summarise(no_default_cust = n_distinct(CUSTOMER[CUSTOMER_DEFAULT == "Y"]))

данные

df <- structure(list(CUSTOMER = c(1L, 1L, 1L, 1L, 2L, 2L), LOAN = c(101L, 
102L, 103L, 104L, 201L, 202L), DATE = c(201601L, 201603L, 201501L, 
201501L, 201601L, 201603L), AMOUNT = c(100L, 100L, 100L, 200L, 
100L, 100L), LOAN_DEFAULT = structure(c(2L, 1L, 2L, 1L, 1L, 1L
), .Label = c("N", "Y"), class = "factor"), CUSTOMER_DEFAULT = structure(c(2L, 
2L, 2L, 2L, 1L, 1L), .Label = c("N", "Y"), class = "factor"), 
DEFAULT_DATE = structure(c(2L, 2L, 2L, 2L, 1L, 1L), .Label = c("-", 
"201501"), class = "factor"), CLASSIFICATION = structure(c(2L, 
2L, 2L, 2L, 1L, 1L), .Label = c("M", "S"), class = "factor")), 
class = "data.frame", row.names = c(NA, -6L))
1 голос
/ 20 апреля 2020

В базе вы можете использовать aggregate, чтобы получить sum из AMOUNT за CUSTOMER. С помощью x[x$DATE == x$DEFAULT_DATE,] вы можете поднастроить те строки, где DATE равно DEFAULT_DATE.

aggregate(AMOUNT ~ CUSTOMER, x[x$DATE == x$DEFAULT_DATE,], sum)
#  CUSTOMER AMOUNT
#1        1    300

Чтобы получить количество клиентов по умолчанию по классификации, вы можете использовать table в сочетании с unique :

table(unique(x[x$CUSTOMER_DEFAULT=="Y",c("CUSTOMER", "CLASSIFICATION")])[,2])
#M S 
#0 1 

Данные:

x <- read.table(header=TRUE, text="CUSTOMER LOAN   DATE    AMOUNT LOAN_DEFAULT CUSTOMER_DEFAULT DEFAULT_DATE CLASSIFICATION
1        101   201601    100    Y               Y            201501          S
1        102   201603    100    N               Y            201501          S
1        103   201501    100    Y               Y            201501          S
1        104   201501    200    N               Y            201501          S
2        201   201601    100    N               N               -            M
2        202   201603    100    N               N               -            M")
0 голосов
/ 20 апреля 2020

Другой вариант с data.table

library(data.table)
setDT(df)[, .(total_sum  = sum(AMOUNT[DATE == first(DEFAULT_DATE)])), CUSTOMER]
...