2016-07-30 76 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