生成序列(并在重复的情况下重新开始)并在R

时间:2018-01-17 10:18:53

标签: r sequence sqldf

我正在寻找一种为列生成序列的方法,列中的城市名称按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"))

2 个答案:

答案 0 :(得分:2)

构建一个&#39;游程编码&#39;并用它来生成序列

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

对于更新的问题,其中两列构成键,将列与唯一符号粘贴在一起并使用

进行计算
rle <- rle(paste(mydf$ID, mydf$City, sep = "\r"))
mydf$Sequence <- unlist(lapply(rle$length, seq_len))

这将是&#39; fast&#39;,特别是与for循环相比。

答案 1 :(得分:0)

一个好的旧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

}