Присвоение дат по категориальной переменной - PullRequest
0 голосов
/ 19 сентября 2018

У меня есть набор Payment Date в следующей форме:

ID  Payment Date   
1   18-01-01
1   18-02-03
2   18-04-03
2   18-05-08
2   18-06-06
3   17-12-23
3   18-01-22
3   18-02-24
4   17-11-09
4   18-12-06

Я хотел бы добавить столбец Activation Date в качестве самой ранней даты платежа для каждого ID, например:

ID  Payment Date   Activation Date
1   18-01-01       18-01-01
1   18-02-03       18-01-01
2   18-04-03       18-04-03
2   18-05-08       18-04-03
2   18-06-06       18-04-03
3   17-12-23       17-12-23
3   18-01-22       17-12-23
3   18-02-24       17-12-23
4   17-11-09       17-11-09
4   18-12-06       17-11-09

Мне интересно, вместо того, чтобы идти по кругу и заботиться о каждом удостоверении личности один за другим, должен быть гораздо более умный способ сделать это.

Ответы [ 3 ]

0 голосов
/ 19 сентября 2018

Решение с использованием data.table

данные:

df1<-
        fread("ID  Payment
    1   18-01-01
    1   18-02-03
    2   18-04-03
    2   18-05-08
    2   18-06-06
    3   17-12-23
    3   18-01-22
    3   18-02-24
    4   17-11-09
    4   18-12-06") %>% setDF

код:

data.table::setDT(df1)[,Activation := Payment[1],by="ID"][]

результат:

 #   ID  Payment Activation
 #1:  1 18-01-01   18-01-01
 #2:  1 18-02-03   18-01-01
 #3:  2 18-04-03   18-04-03
 #4:  2 18-05-08   18-04-03
 #5:  2 18-06-06   18-04-03
 #6:  3 17-12-23   17-12-23
 #7:  3 18-01-22   17-12-23
 #8:  3 18-02-24   17-12-23
 #9:  4 17-11-09   17-11-09
#10:  4 18-12-06   17-11-09

Подсказка:

  • Никогда не используйте пробелы в именах столбцов снова
  • используйте подчеркивание или верблюд.Например: payment_date, paymentDate
0 голосов
/ 19 сентября 2018

Использование sqldf:

Ваш набор данных:

df=read.table(text="ID  PaymentDate   
          1   18-01-01
          1   18-02-03
          2   18-04-03
          2   18-05-08
          2   18-06-06
          3   17-12-23
          3   18-01-22
          3   18-02-24
          4   17-11-09
          4   18-12-06",header=T)

Код

# we can first find the minimum PaymentDate using the inner query and then
# populate the data.frame using the inner query
sqldf("select a.ID,a.PaymentDate, b.ActivationDate from df as a JOIN 
 (select ID,min(PaymentDate) as ActivationDate from df group by ID) as b where a.ID=b.ID")

Вывод:

   ID PaymentDate ActivationDate
1   1    18-01-01       18-01-01
2   1    18-02-03       18-01-01
3   2    18-04-03       18-04-03
4   2    18-05-08       18-04-03
5   2    18-06-06       18-04-03
6   3    17-12-23       17-12-23
7   3    18-01-22       17-12-23
8   3    18-02-24       17-12-23
9   4    17-11-09       17-11-09
10  4    18-12-06       17-11-09
0 голосов
/ 19 сентября 2018
df = read.table(text = "
ID  PaymentDate   
1   18-01-01
1   18-02-03
2   18-04-03
2   18-05-08
2   18-06-06
3   17-12-23
3   18-01-22
3   18-02-24
4   17-11-09
4   18-12-06
", header=T)

library(dplyr)
library(lubridate)

df %>%
  group_by(ID) %>%
  mutate(ActivationDate = min(ymd(PaymentDate))) %>%
  ungroup()

# # A tibble: 10 x 3
#     ID PaymentDate ActivationDate
#   <int> <fct>       <date>        
# 1     1 18-01-01    2018-01-01    
# 2     1 18-02-03    2018-01-01    
# 3     2 18-04-03    2018-04-03    
# 4     2 18-05-08    2018-04-03    
# 5     2 18-06-06    2018-04-03    
# 6     3 17-12-23    2017-12-23    
# 7     3 18-01-22    2017-12-23    
# 8     3 18-02-24    2017-12-23    
# 9     4 17-11-09    2017-11-09    
#10     4 18-12-06    2017-11-09 

Если ваш набор данных уже упорядочен и вы не хотите использовать форматы Date, вы можете использовать

df %>%
  group_by(ID) %>%
  mutate(ActivationDate = first(PaymentDate)) %>%
  ungroup()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...