我有一个这样的数据表:
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万行需要几个小时。
答案 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"))