Как создать новый столбец на основе нескольких условий в R? - PullRequest
1 голос
/ 19 апреля 2020
CUSTOMER LOAN   DATE    LOAN_DEFAULT CUSTOMER_DEFAULT 
1        101   201601        Y               Y            
1        102   201603        N               Y           
1        101   201501        Y               Y            
2        201   201601        N               N               
2        202   201603        N               N 

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

Я хочу создать новый столбец "DEFAULT_DATE" на основе DATE и LOAN_DEFAULT на уровне CUSTOMER, а дата является самой ранней датой по умолчанию, как показано ниже:

CUSTOMER LOAN   DATE    LOAN_DEFAULT CUSTOMER_DEFAULT DEFAULT_DATE 
1        101   201601        Y               Y            201501
1        102   201603        N               Y            201501
1        103   201501        Y               Y            201501
2        201   201601        N               N               -
2        202   201603        N               N               -

Как я могу это сделать?

Ответы [ 2 ]

1 голос
/ 19 апреля 2020

Предполагая, что столбец DATE имеет формат год-месяц, мы можем добавить произвольную дату для преобразования DATE в класс Date, arrange данных в CUSTOMER и DATE и получить данные первого LOAN_DEFAULT за каждый CUSTOMER.

library(dplyr)

df %>%
  mutate(DATE = as.Date(paste0(DATE, '01'), '%Y%m%d')) %>%
  arrange(CUSTOMER, DATE) %>%
  group_by(CUSTOMER) %>%
  mutate(DEFAULT_DATE = DATE[which(LOAN_DEFAULT == 'Y')[1]])


#  CUSTOMER  LOAN DATE       LOAN_DEFAULT CUSTOMER_DEFAULT DEFAULT_DATE
#     <int> <int> <date>     <fct>        <fct>            <date>      
#1        1   101 2015-01-01 Y            Y                2015-01-01  
#2        1   101 2016-01-01 Y            Y                2015-01-01  
#3        1   102 2016-03-01 N            Y                2015-01-01  
#4        2   201 2016-01-01 N            N                NA          
#5        2   202 2016-03-01 N            N                NA       
0 голосов
/ 19 апреля 2020

Вот вариант с data.table

library(data.table)
setDT(df)[, Date := as.IDate(paste0(DATE, '01'), '%Y%m%d'))
      ][order(CUSTOMER, DATE), DEFAULT_DATE := 
            DATE[match('Y', LOAN_DEFAULT)] , CUSTOMER][]
...