R 按连续的升序ID对数据帧行进行分组

R 按连续的升序ID对数据帧行进行分组,r,dataframe,grouping,sequential,R,Dataframe,Grouping,Sequential,我对编程艺术(循环等)还比较陌生,如果我能对我的方法是否合适或者如果它将要在更大的样本上使用,我将非常感激 目前我有大约20000个观察结果,其中一列是收据ID。我想要实现的是将每一行分配给一个组,该组由以n+1格式升序的ID组成。如果此规则被破坏,则应创建新组,直到再次破坏该规则 为了举例说明,假设我有这个表(重要的一点是ID不一定是唯一的,可以重复,就像我的示例中的ID 10): 我使用dplyr以升序方式对ID进行排序。然后创建变量MyData$Group,我只是用1填充它 rep(1,l

我对编程艺术(循环等)还比较陌生,如果我能对我的方法是否合适或者如果它将要在更大的样本上使用,我将非常感激

目前我有大约20000个观察结果,其中一列是收据ID。我想要实现的是将每一行分配给一个组,该组由以n+1格式升序的ID组成。如果此规则被破坏,则应创建新组,直到再次破坏该规则

为了举例说明,假设我有这个表(重要的一点是ID不一定是唯一的,可以重复,就像我的示例中的ID 10):

我使用dplyr以升序方式对ID进行排序。然后创建变量MyData$Group,我只是用1填充它

rep(1,length(MyTable$ID)

for (i in 2:length(MyTable$ID) ) {
  if(MyTable$ID[i] == MyTable$ID[i-1]+1 | MyTable$ID[i] == MyTable$ID[i-1]) {
    MyTable$ID[i] <- MyTable$GROUP[i-1]
     } else {
       MyTable$GROUP[i] <- MyTable$GROUP[i-1]+1
  }
}
rep(1,长度(MyTable$ID)
用于(i/2:长度(MyTable$ID)){
if(MyTable$ID[i]==MyTable$ID[i-1]+1 | MyTable$ID[i]==MyTable$ID[i-1]){

MyTable$ID[i]长话短说:

MyTable$Group <- cumsum(c(1, diff(MyTable$ID) != 1))
#     ID Group
#1     1     1
#2     2     1
#3     3     1
#4     4     1
#5     6     2
#6     7     2
#7     8     2
#8    10     3
#9    11     3
#10   12     3
#11   17     4
#12   18     4
#13   19     4
#14  200     5
#15  201     5
#16  202     5
#17 2010     6
#18 2011     6
#19 2013     7

长话短说:

MyTable$Group <- cumsum(c(1, diff(MyTable$ID) != 1))
#     ID Group
#1     1     1
#2     2     1
#3     3     1
#4     4     1
#5     6     2
#6     7     2
#7     8     2
#8    10     3
#9    11     3
#10   12     3
#11   17     4
#12   18     4
#13   19     4
#14  200     5
#15  201     5
#16  202     5
#17 2010     6
#18 2011     6
#19 2013     7

如果有效,那么在R中使用for循环总是被避免的!但是从初学者的角度来看,是的,这很好。现在尝试从“应用”家族观点来提高效率“基于不违反+1规则”被称为“顺序ID”或“连续ID”:另外,除非它与RStudio(IDE)有明确的关系,否则不要给它加上标签,在这种情况下它不会。如果它起作用,那么在R中使用for循环是很好的!但是从初学者的角度来看,是的,这很好。现在,尝试从“应用”家族的角度考虑,在不违反+1规则的基础上,提高效率被称为“顺序ID”或“连续ID”:)此外,除非它与RStudio(IDE)有明确的关系,否则不要对此进行标记我不认为你需要把他的母亲带到这件事中:)你如何编辑你的问题,以包括这些重复ID的例子。如果你不包括它们,人们就不可能预料到这些小问题,正如内森所写的那样……我们怎么知道这一点呢!所以做一个好的可复制的例子吧!我已经更新了我的答案…我认为你不需要把他的母亲带到这个问题中:)你如何编辑你的问题以包含这些重复ID的示例。如果你不包含这些ID,人们就不可能预料到这些小问题,正如内森所写的那样…我们怎么知道这些呢!所以做一个好的重复示例!我已经更新了我的答案。。。
MyTable$Group <- cumsum(c(1, diff(MyTable$ID) != 1))
#     ID Group
#1     1     1
#2     2     1
#3     3     1
#4     4     1
#5     6     2
#6     7     2
#7     8     2
#8    10     3
#9    11     3
#10   12     3
#11   17     4
#12   18     4
#13   19     4
#14  200     5
#15  201     5
#16  202     5
#17 2010     6
#18 2011     6
#19 2013     7
MyTable <- data.frame(ID = c(1,2,3,4,6,7,8,10,10,11,17,18,19,200,201,202,2010,2011,2013))
MyTable$Group <- cumsum(c(1, !diff(MyTable$ID) %in% c(0,1) ))

#     ID Group
#1     1     1
#2     2     1
#3     3     1
#4     4     1
#5     6     2
#6     7     2
#7     8     2
#8    10     3
#9    10     3
#10   11     3
#11   17     4
#12   18     4
#13   19     4
#14  200     5
#15  201     5
#16  202     5
#17 2010     6
#18 2011     6
#19 2013     7