基于R中的前几行为组赋值

基于R中的前几行为组赋值,r,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

我有这样一个数据表:

  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
逻辑是:
Seq=当Type=I
Seq=当Type=A或C时,用户先前出现的I

基本上,对于一个给定的用户数,I的所有出现都是顺序的。如果A或C出现在两者之间,则为其指定出现在其之前的I值。ID已使用日期字段进行排序

我也提到了下面的内容,但没有帮助,因为如果一个用户的“A”出现两次,那么第二次出现的数字就不正确


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

我认为
数据。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

我认为
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

我们可以使用
dplyr

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

我们可以使用
dplyr

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

第一个数据表中缺少
类型
列。此外,您的逻辑对于后续的复发也不清楚。计数是3,4,。。。随着更多倍数的出现?我在原始问题中做了更改。第一个数据表中缺少
Type
列。此外,您的逻辑对于后续的复发也不清楚。计数是3,4,。。。当更多的倍数出现时?我在原来的问题中做了更改。你的解决方案只是碰巧应用到示例中。尝试添加第三个ID。例如,
10:3i
@pierrelaey您的解决方案是在每组之后将序列重置为0。但也许这就是预期的产出。如果不是,OP会澄清。@Pierrelaffortune我明白了,是的,如果新ID的第一个类型不是I,这将变为0。但我也意识到他没有指定应该发生什么,所以我很好奇这个解决方案是完美的。如果A或C是第一条记录,则应为其分配序号0。谢谢你的帮助。我将以1000万的记录运行它,希望它运行得更快。您的解决方案只是碰巧应用到了示例中。尝试添加第三个ID。例如,
10:3i
@pierrelaey您的解决方案是在每组之后将序列重置为0。但也许这就是预期的产出。如果不是,OP会澄清。@Pierrelaffortune我明白了,是的,如果新ID的第一个类型不是I,这将变为0。但我也意识到他没有指定应该发生什么,所以我很好奇这个解决方案是完美的。如果A或C是第一条记录,则应为其分配序号0。谢谢你的帮助。我将以1000万的记录运行它,希望它能运行得更快。谢谢你的回复。dplyr也解决了我的问题,但需要几秒钟才能运行大量数据。另一方面,data.table命令可以在眨眼之间运行。感谢您的回复。dplyr也解决了我的问题,但需要几秒钟才能运行大量数据。另一方面,data.table命令在眨眼之间运行。