生成序列(并在重复出现的情况下重新开始),并在R组中添加每个序列编号最高的新列

生成序列(并在重复出现的情况下重新开始),并在R组中添加每个序列编号最高的新列,r,sequence,sqldf,R,Sequence,Sqldf,我正在寻找一种方法来为一个列生成一个序列,其中包含按ID分组的城市名称。至关重要的是,当一个城市的名称被重复(在组中)时,必须开始一个新的序列。如果有新ID,还应启动新序列 编辑: 如何创建上述序列的问题已经解决。为了帮助以后选择序列号最高的行,我正在寻找一种方法,在数据框中添加一个新列,为每个记录、每个序列、每个ID显示每个序列的最高编号 以下是我想要实现的一个示例,基于我的数据框的简化版本: ID City Sequence Highest_number 1 Nijmege

我正在寻找一种方法来为一个列生成一个序列,其中包含按ID分组的城市名称。至关重要的是,当一个城市的名称被重复(在组中)时,必须开始一个新的序列。如果有新ID,还应启动新序列

编辑:

如何创建上述序列的问题已经解决。为了帮助以后选择序列号最高的行,我正在寻找一种方法,在数据框中添加一个新列,为每个记录、每个序列、每个ID显示每个序列的最高编号

以下是我想要实现的一个示例,基于我的数据框的简化版本:

ID  City    Sequence    Highest_number
1   Nijmegen    1    2
1   Nijmegen    2    2
1   Arnhem      1    2
1   Arnhem      2    2
1   Nijmegen    1    1
1   Arnhem      1    3
1   Arnhem      2    3
1   Arnhem      3    3
1   Nijmegen    1    1
2   Nijmegen    1    1
2   Utrecht     1    1
2   Amsterdam   1    2
2   Amsterdam   2    2
2   Utrecht     1    4
2   Utrecht     2    4
2   Utrecht     3    4
2   Utrecht     4    4 

mydf <- data.frame(ID = c(1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2), 
        City = c("Nijmegen", "Nijmegen", "Arnhem", "Arnhem", "Nijmegen", 
        "Arnhem", "Arnhem","Arnhem", "Nijmegen", "Nijmegen", "Utrecht", 
       "Amsterdam", "Amsterdam", "Utrecht", "Utrecht", "Utrecht", "Utrecht"))
ID城市序列最高\u编号
1奈梅根1 2
1奈梅根2 2
1阿纳姆1 2
1阿纳姆2 2
1奈梅根1 1
1阿纳姆13
1阿纳姆2 3
1阿纳姆3 3
1奈梅根1 1
2奈梅根1 1
2乌得勒支1
2阿姆斯特丹1 2
阿姆斯特丹2 2
2乌得勒支1 4
2乌得勒支2 4
2乌得勒支3 4
2乌得勒支4

mydf一个好的旧for循环可以实现这一点

mydf$Sequence <- NA

for(i in seq_len(nrow(mydf))) {
  if (i == 1 || (mydf$City[i] != mydf$City[i-1]) || (mydf$ID[i] != mydf$ID[i-1]))
    mydf$Sequence[i] <- 1
  else
    mydf$Sequence[i] <- mydf$Sequence[i-1] + 1

}

mydf$Sequence构造一个“运行长度编码”,并使用它生成序列

rle <- rle(as.character(mydf$City))
mydf$Sequence <- unlist(lapply(rle$length, seq_len))

rle感谢大家关注
rle()
!非常方便的功能,直到现在我才知道。谢谢你的快速回复。不幸的是,此解决方案没有解决在出现新ID(group by)时序列也必须重新开始的问题。我编辑了我的示例,以便ID 1和2共享一个城市的序列(“奈梅根”)。@Thijs不是创建
myddf$city
的rle,而是从
粘贴创建它(mydf$ID,mydf$city,sep=“\r”)
;例如,这就是
duplicated.data.frame()
中使用的方法。感谢您的快速回复。不幸的是,此解决方案没有解决在出现新ID(group by)时序列也必须重新开始的问题。我已经编辑了我的示例,以便ID 1和ID 2共享一个城市(“奈梅根”)的序列。。。只需添加重置为1的另一个条件,如果我理解正确,谢谢您的回复,它似乎与原始数据帧完美配合。我编辑了我的帖子并提出了一个新问题(基于已经解决的问题)。我在前面尝试过使用:mydf_2%group_by(ID,City)%%>%mutate(Count_2=tail(n())来解决这个问题,但这并没有给出我试图实现的结果。我个人会使用
sqldf
,如果你知道SQL,你应该能够毫不费力地做到这一点,使用
创建表max_值作为select ID,City,max(value)来自mydf组,按id,城市。然后合并到您现有的数据。谢谢,我无法让create table正常工作(因为一个错误),但我成功地做到了这一点:mydf_2,但这段代码没有考虑到,对于每个城市序列,最大的数字应该放在一列中,因为对于每个id,数据框中只有一个唯一的城市。
rle <- rle(paste(mydf$ID, mydf$City, sep = "\r"))
mydf$Sequence <- unlist(lapply(rle$length, seq_len))