慕的地10843
使用ave..假设你data.frame名为“mydf”:mydf$counter <- with(mydf, ave(CustomerID, CustomerID, FUN = seq_along))mydf# CustomerID TripDate counter# 1 1 1/3/2013 1# 2 1 1/4/2013 2# 3 1 1/9/2013 3# 4 2 2/1/2013 1# 5 2 2/4/2013 2# 6 3 1/2/2013 1为了说明它的价值,我还在我的“splitstackform”包中包含的函数中实现了该方法的一个版本。这个函数被调用getanID:mydf <- data.frame(IDA = c("a", "a", "a", "b", "b", "b", "b"), IDB = c(1, 2, 1, 1, 2, 2, 2), values = 1:7)mydf# install.packages("splitstackshape")library(splitstackshape)# getanID(mydf, id.vars = c("IDA", "IDB"))getanID(mydf, id.vars = 1:2)# IDA IDB values .id# 1 a 1 1 1# 2 a 2 2 1# 3 a 1 3 2# 4 b 1 4 1# 5 b 2 5 1# 6 b 2 6 2# 7 b 2 7 3从上面的示例中可以看到,我编写函数的方式是可以指定一个或多个列作为ID列。它检查是否有任何id.vars被复制,如果是,那么它将为您生成一个新的ID变量。
慕运维8079593
您也可以使用plyr为此(使用@AnadaMahto的示例数据):> ddply(mydf, .(IDA), transform, .id = seq_along(IDA)) IDA IDB values .id1 a 1 1 12 a 2 2 23 a 1 3 34 b 1 4 15 b 2 5 26 b 2 6 37 b 2 7 4甚至:> ddply(mydf, .(IDA, IDB), transform, .id = seq_along(IDA)) IDA IDB values .id1 a 1 1 12 a 1 3 23 a 2 2 14 b 1 4 15 b 2 5 16 b 2 6 27 b 2 7 3请注意plyr没有最快的解决方案的美誉,因为你需要看一看data.table.这是一个data.table方法:library(data.table)DT <- data.table(mydf)DT[, .id := sequence(.N), by = "IDA,IDB"]DT# IDA IDB values .id# 1: a 1 1 1# 2: a 2 2 1# 3: a 1 3 2# 4: b 1 4 1# 5: b 2 5 1# 6: b 2 6 2# 7: b 2 7 3