2016-07-30 15 views
1

年ごとに2つのグループがあり、最初のグループは2番目のグループの上に積み重ねられます。私は列が1番目または2番目にあることを示す列を追加したいと思います。この例ではグループをマークしましたが、フィールドは実際のデータセットには表示されません。積み重ねられたデータセットにラベルを付ける

year measure data ... 
1991  1 ... [group 1] 
1991  2  [group 1] 
1991  3  [group 1] 
1991  1  [group 2] 
1991  2  [group 2] 
1991  3  [group 2] 
1991  4  [group 2] 
1992  1  [group 1] 
1992  2  [group 1] 
1992  3  [group 1] 
1992  1  [group 2] 
1992  2  [group 2] 
1992  3  [group 2] 
1992  4  [group 2] 

答えて

1

我々はdata.tabledplyrまたはbase Rのいずれかの方法で試すことができます。 data.tableを使用して 'data.frame'を 'data.table'(setDT(df1))に変換し、 '年'でグループ化し、 'measure'の隣接要素の差異が0未満であることを確認して累積合計を取得し、paste 'グループ'を使用して 'grp'列を作成します。

library(data.table) 
setDT(df1)[, grp := paste("group", cumsum(c(TRUE, diff(measure) < 0))), year] 
df1 
# year measure  grp 
#1: 1991  1 group 1 
#2: 1991  2 group 1 
#3: 1991  3 group 1 
#4: 1991  1 group 2 
#5: 1991  2 group 2 
#6: 1991  3 group 2 
#7: 1991  4 group 2 
#8: 1992  1 group 1 
#9: 1992  2 group 1 
#10:1992  3 group 1 
#11:1992  1 group 2 
#12:1992  2 group 2 
#13:1992  3 group 2 
#14:1992  4 group 2 

同じ方法論はdplyr

library(dplyr) 
df1 %>% 
    group_by(year) %>% 
    mutate(grp = paste("group", cumsum(c(TRUE, diff(measure) < 0)))) 
+0

で使用することができ、このメカニックは何をしているのですか? 'cumsum(c(TRUE、' – Hatshepsut

+1

@Hatshepsut diffは元の長さよりも1だけ短い長さを返すので、diff出力を論理値に変換した後にTRUEで連結し、cumsumを実行するとTRUE/FALSEがバイナリに変換され、TRUE値ごとに1つが追加されます。 – akrun

関連する問題