2016-07-24 3 views
0

У меня есть следующие переменные в dataframe:Секвенирование вар в каждую дату

App.Date   App.No. 
01/01/2012  A0001 
01/01/2012  A0082 
01/01/2012  F0003 
02/01/2012  A0004 
02/01/2012  A0055 
03/01/2012  P0006 
03/01/2012  A0007 
03/01/2012  A0008 
03/01/2012  A0009 
.........  ...... 

Я хочу, чтобы создать переменную, которая будет отслеживать порядок на каждую дату Выход будет еще одна переменная, которая будет последовательно и запуск при каждом изменении даты

App.Date   App.No. Seq 
01/01/2012  A0001 1 
01/01/2012  A0082 2 
01/01/2012  F0003 3 
02/01/2012  A0004 1 
02/01/2012  A0055 2 
03/01/2012  P0006 1 
03/01/2012  A0007 2 
03/01/2012  A0008 3 
03/01/2012  A0009 4 
.........  ...... . 

Как я могу сделать это в R без цикла? Есть более 100 тыс. Строк, приходится создавать серию при каждом изменении даты.

ответ

1

Вы можете использовать dplyr с функцией mutate, чтобы создать новый столбец, который будет вектор из 1 количеству строк в каждой группе по дате:

library(dplyr) 
df <- df %>% group_by(App.Date) %>% mutate(seq = 1:n()) 
df  

# Source: local data frame [9 x 3] 
# Groups: App.Date [3] 

#  App.Date App.No. seq 
#  <fctr> <fctr> <int> 
# 1 01/01/2012 A0001  1 
# 2 01/01/2012 A0082  2 
# 3 01/01/2012 F0003  3 
# 4 02/01/2012 A0004  1 
# 5 02/01/2012 A0055  2 
# 6 03/01/2012 P0006  1 
# 7 03/01/2012 A0007  2 
# 8 03/01/2012 A0008  3 
# 9 03/01/2012 A0009  4 

Или использовать ave, чтобы сделать cumsum на последовательность из них сгруппированы по App.Date:

df$Seq <- ave(rep(1, nrow(df)), df$App.Date, FUN = cumsum) 
df$Seq 
# [1] 1 2 3 1 2 1 2 3 4 

Когда вы освоитесь с data.table пакета:

library(data.table) 
setDT(df) 
df[, Seq := 1:.N, .(App.Date)]