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