基于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命令在眨眼之间运行。