2016-07-30 93 views
1

每年有兩組,第一組堆疊在第二組之上。我想添加一列表示一行是在哪一組:第一或第二。我爲此示例標記了組,但該字段未出現在真實數據集中。標記堆疊數據集

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.tabledplyrbase R方法試試。使用data.table,我們將'data.frame'轉換爲'data.table'(setDT(df1)),按'年份'進行分組,我們檢查'measure'的相鄰元素差異小於0,得到累計和,並且paste用'group'創建'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的長度,所以我們在將差異輸出轉換爲邏輯數據並將cum輸出轉換爲邏輯數據後與TRUE進行連接,TRUE/FALSE強制轉換爲二進制,併爲每個TRUE值添加一個。 – akrun