我正在寻找一种方法来生成一个列的序列,其列表按城市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"))
构造一个'游程编码'并使用它来生成序列
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))
这将是“快速”,特别是与for循环相比。
一个好老的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
}