2017-02-12 9 views
0

アムに日付に基づいて一意のIDを作成します。..これを理解しようとしている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は、配管のコマンドを認識していることを思えません。 IDは日付シーケンスに従います。

dplyrを使用してこれを達成するにはどうすればよいですか? as.characterまたはas.Dateの日付の場合、動作しません。

+0

を使用することができますか?あなたは単純に突然変異を起こすことができます。つまり、 'df%>%group_by(id)%>突然変異(新しい=一致(日付、ユニーク(日付))' – 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

をあなたは `transform`を使用しないのはなぜ私たちはdata.table

library(data.table) 
setDT(df1)[, flag := match(date, unique(date)), by = id] 
関連する問題