2017-02-12 7 views
0

Am пытается выяснить это ..создать уникальный идентификатор, основанный на дате в R

У меня есть этот набор данных:

id  date 
1 1 2016-01-01 
2 1 2016-01-01 
3 1 2016-01-02 
4 2 2016-01-01 
5 2 2016-01-03 
6 2 2016-01-04 
7 3 2016-01-01 
8 3 2016-01-05 
9 3 2016-01-05 

так что я пытаюсь использовать dplyr для этого, по:

transformed <- data %>% group_by(id) %>% transform(., flag=match(date, unique(date))) 

и я получил это:

id  date flag 
1 1 2016-01-01 1 
2 1 2016-01-01 1 
3 1 2016-01-02 2 
4 2 2016-01-01 1 
5 2 2016-01-03 3 
6 2 2016-01-04 4 
7 3 2016-01-01 1 
8 3 2016-01-05 5 
9 3 2016-01-05 5 

но я стремясь к этому,

id  date flag 
1 1 2016-01-01 1 
2 1 2016-01-01 1 
3 1 2016-01-02 2 
4 2 2016-01-01 1 
5 2 2016-01-03 2 
6 2 2016-01-04 3 
7 3 2016-01-01 1 
8 3 2016-01-05 2 
9 3 2016-01-05 2 

с первого взгляда, это не кажется, что transform распознает команду трубопроводов. Иды следуют за порядком даты.

Как достичь этого с помощью dplyr? Для дат as.character или as.Date, это не работает.

+0

Почему вы используете 'transform'? Вы можете просто мутировать, т. Е. 'Df%>% group_by (id)%>% mutate (new = match (date, unique (date)))' – Sotos

+0

о, мой бог .. я должен был осознать. большое спасибо! – bzzbzzRzzbzz

ответ

1

Вы можете использовать следующие для этого:

library(dplyr) 
df %>% 
group_by(id) %>% 
#convert the date into a factor and then into numeric 
#which will give you what you need 
mutate(flag = as.numeric(as.factor(date))) 

Выход:

Source: local data frame [9 x 3] 
Groups: id [3] 

    id  date flag 
    <int>  <chr> <dbl> 
1  1 2016-01-01  1 
2  1 2016-01-01  1 
3  1 2016-01-02  2 
4  2 2016-01-01  1 
5  2 2016-01-03  2 
6  2 2016-01-04  3 
7  3 2016-01-01  1 
8  3 2016-01-05  2 
9  3 2016-01-05  2 
1

Мы можем использовать data.table

library(data.table) 
setDT(df1)[, flag := match(date, unique(date)), by = id] 

 Смежные вопросы

  • Нет связанных вопросов^_^