根据R中的先前行为组分配值

时间:2016-04-01 19:55:57

标签: r

我有一个这样的数据表:

  ID Type
  1    I
  1    A
  1    A
  2    I
  2    A
  2    I  
  2    C
  2    I
  2    I

我想添加如下列的列:

   ID Type Seq
   1    I   1
   1    A   1
   1    A   1
   2    I   1
   2    A   1
   2    I   2
   2    C   2
   2    I   3
   2    I   4

逻辑是:
当Type = I时,Seq = previous_row_for_user_where_I_occurs +1 Seq =当用户输入I时,当Type = A或C

所以基本上,对于给定的用户编号,所有出现的I顺序排列。如果A或C出现在它们之间,则为其分配在它之前发生的I值。已使用日期字段对ID进行排序。

我也提到了下面但它没有帮助,因为如果" A"对于用户发生两次,第二次出现没有正确编号。
Assigning values in a sequence depending on previous row in R

我现在使用for循环,因为我有1000万行需要几个小时。

2 个答案:

答案 0 :(得分:3)

我认为data.table包是此问题的最佳选择:

> dt[, Seq := cumsum(Type == "I"), by = ID]
> dt
   ID Type Seq
1:  1    I   1
2:  1    A   1
3:  1    A   1
4:  2    I   1
5:  2    A   1
6:  2    I   2
7:  2    C   2
8:  2    I   3
9:  2    I   4

答案 1 :(得分:0)

我们可以使用dplyr

library(dplyr)
df1 %>%
  group_by(ID) %>%
  mutate(Seq = cumsum(Type=="I"))