Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 数据帧中行的矢量化编号_R - Fatal编程技术网

R 数据帧中行的矢量化编号

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

我有一个由大量相关记录组成的大型有序数据框。对于每组相关记录,我需要将它们从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  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
实现这一点。你能发布一些示例数据吗?