R 数据帧中行的矢量化编号
我有一个由大量相关记录组成的大型有序数据框。对于每组相关记录,我需要将它们从1编号到相关记录总数。如果我在整个数据帧上迭代,则该操作花费的时间太长 我想知道是否有一种矢量化的方法可以做到这一点 例如,如果我有这个数据帧:R 数据帧中行的矢量化编号,r,R,我有一个由大量相关记录组成的大型有序数据框。对于每组相关记录,我需要将它们从1编号到相关记录总数。如果我在整个数据帧上迭代,则该操作花费的时间太长 我想知道是否有一种矢量化的方法可以做到这一点 例如,如果我有这个数据帧: ID Month State 1 Apr-2014 AL 2 May-2014 AL 3 Jun-2014 AL 4 Apr-2014 MN 5 May-2014 MN 6 Apr-2014 FL 7 May-2014 FL
ID Month State
1 Apr-2014 AL
2 May-2014 AL
3 Jun-2014 AL
4 Apr-2014 MN
5 May-2014 MN
6 Apr-2014 FL
7 May-2014 FL
最后,我想说:
ID Month State Seq
1 Apr-2014 AL 1
2 May-2014 AL 2
3 Jun-2014 AL 3
4 Apr-2014 MN 1
5 May-2014 MN 2
6 Apr-2014 FL 1
7 May-2014 FL 2
使用示例数据集。如果数据集已排序,则可以将
月份的前一行与当前行进行比较,并检查它们是否不同。在代码下方,我删除了第一个观察值df$Month[-1]
,并将其与上次删除的观察值df$Month[-nrow(df)]
进行比较,以便长度相等。通过使用=
,对于不同的值,我们得到TRUE
。在开始处连接TRUE
,然后执行cumsum
以获取索引
df$Seq <- cumsum(c(TRUE,df$Month[-1]!= df$Month[-nrow(df)]))
df
# ID Month State Seq
#1 1 Apr-2014 AL 1
#2 2 Apr-2014 MN 1
#3 3 Apr-2014 FL 1
#4 4 May-2014 AL 2
#5 5 May-2014 MN 2
#6 6 May-2014 FL 2
#7 7 Jun-2014 AL 3
或使用data.table
library(data.table)
DT <- setDT(df)[, Seq:= .GRP, by=Month]
DT
# ID Month State Seq
#1: 1 Apr-2014 AL 1
#2: 2 Apr-2014 MN 1
#3: 3 Apr-2014 FL 1
#4: 4 May-2014 AL 2
#5: 5 May-2014 MN 2
#6: 6 May-2014 FL 2
#7: 7 Jun-2014 AL 3
使用示例数据集。如果数据集已排序,则可以将月份的前一行与当前行进行比较,并检查它们是否不同。在代码下方,我删除了第一个观察值df$Month[-1]
,并将其与上次删除的观察值df$Month[-nrow(df)]
进行比较,以便长度相等。通过使用=
,对于不同的值,我们得到TRUE
。在开始处连接TRUE
,然后执行cumsum
以获取索引
df$Seq <- cumsum(c(TRUE,df$Month[-1]!= df$Month[-nrow(df)]))
df
# ID Month State Seq
#1 1 Apr-2014 AL 1
#2 2 Apr-2014 MN 1
#3 3 Apr-2014 FL 1
#4 4 May-2014 AL 2
#5 5 May-2014 MN 2
#6 6 May-2014 FL 2
#7 7 Jun-2014 AL 3
或使用data.table
library(data.table)
DT <- setDT(df)[, Seq:= .GRP, by=Month]
DT
# ID Month State Seq
#1: 1 Apr-2014 AL 1
#2: 2 Apr-2014 MN 1
#3: 3 Apr-2014 FL 1
#4: 4 May-2014 AL 2
#5: 5 May-2014 MN 2
#6: 6 May-2014 FL 2
#7: 7 Jun-2014 AL 3
如果你不关心实际的序号,你可以简单地做:
df$Seq <- as.numeric(as.factor(df$Month))
df
# ID Month State Seq
# 1 1 Apr-2014 AL 1
# 2 2 Apr-2014 MN 1
# 3 3 Apr-2014 FL 1
# 4 4 May-2014 AL 3
# 5 5 May-2014 MN 3
# 6 6 May-2014 FL 3
# 7 7 Jun-2014 AL 2
df$Seq如果您不关心实际的Seq编号,您可以简单地执行以下操作:
df$Seq <- as.numeric(as.factor(df$Month))
df
# ID Month State Seq
# 1 1 Apr-2014 AL 1
# 2 2 Apr-2014 MN 1
# 3 3 Apr-2014 FL 1
# 4 4 May-2014 AL 3
# 5 5 May-2014 MN 3
# 6 6 May-2014 FL 3
# 7 7 Jun-2014 AL 2
df$Seq使用data.table
或dplyr
可以快速有效地实现这一点。您可以发布一些示例数据吗?有一些快速有效的方法可以通过数据表
或dplyr
实现这一点。你能发布一些示例数据吗?