创建多变量计数器

创建多变量计数器

我的数据如下:


CustomerID TripDate

1           1/3/2013

1           1/4/2013

1           1/9/2013

2           2/1/2013

2           2/4/2013

3           1/2/2013

我需要创建一个计数器变量,如下所示:


CustomerID TripDate   TripCounter

1           1/3/2013   1

1           1/4/2013   2 

1           1/9/2013   3

2           2/1/2013   1

2           2/4/2013   2 

3           1/2/2013   1 

Tripcounter对每一位顾客都是如此。


皈依舞
浏览 508回答 3
3回答

HUX布斯

使用ave..假设你data.frame名为“mydf”:mydf$counter <- with(mydf, ave(CustomerID, CustomerID, FUN = seq_along))mydf#&nbsp; &nbsp;CustomerID TripDate counter# 1&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1 1/3/2013&nbsp; &nbsp; &nbsp; &nbsp;1# 2&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1 1/4/2013&nbsp; &nbsp; &nbsp; &nbsp;2# 3&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1 1/9/2013&nbsp; &nbsp; &nbsp; &nbsp;3# 4&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2 2/1/2013&nbsp; &nbsp; &nbsp; &nbsp;1# 5&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2 2/4/2013&nbsp; &nbsp; &nbsp; &nbsp;2# 6&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 3 1/2/2013&nbsp; &nbsp; &nbsp; &nbsp;1为了说明它的价值,我还在我的“splitstackform”包中包含的函数中实现了该方法的一个版本。这个函数被调用getanID:mydf <- data.frame(IDA = c("a", "a", "a", "b", "b", "b", "b"),&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;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)#&nbsp; &nbsp;IDA IDB values .id# 1&nbsp; &nbsp;a&nbsp; &nbsp;1&nbsp; &nbsp; &nbsp; 1&nbsp; &nbsp;1# 2&nbsp; &nbsp;a&nbsp; &nbsp;2&nbsp; &nbsp; &nbsp; 2&nbsp; &nbsp;1# 3&nbsp; &nbsp;a&nbsp; &nbsp;1&nbsp; &nbsp; &nbsp; 3&nbsp; &nbsp;2# 4&nbsp; &nbsp;b&nbsp; &nbsp;1&nbsp; &nbsp; &nbsp; 4&nbsp; &nbsp;1# 5&nbsp; &nbsp;b&nbsp; &nbsp;2&nbsp; &nbsp; &nbsp; 5&nbsp; &nbsp;1# 6&nbsp; &nbsp;b&nbsp; &nbsp;2&nbsp; &nbsp; &nbsp; 6&nbsp; &nbsp;2# 7&nbsp; &nbsp;b&nbsp; &nbsp;2&nbsp; &nbsp; &nbsp; 7&nbsp; &nbsp;3从上面的示例中可以看到,我编写函数的方式是可以指定一个或多个列作为ID列。它检查是否有任何id.vars被复制,如果是,那么它将为您生成一个新的ID变量。

哈士奇WWW

您也可以使用plyr为此(使用@AnadaMahto的示例数据):> ddply(mydf, .(IDA), transform, .id = seq_along(IDA))&nbsp; IDA IDB values .id1&nbsp; &nbsp;a&nbsp; &nbsp;1&nbsp; &nbsp; &nbsp; 1&nbsp; &nbsp;12&nbsp; &nbsp;a&nbsp; &nbsp;2&nbsp; &nbsp; &nbsp; 2&nbsp; &nbsp;23&nbsp; &nbsp;a&nbsp; &nbsp;1&nbsp; &nbsp; &nbsp; 3&nbsp; &nbsp;34&nbsp; &nbsp;b&nbsp; &nbsp;1&nbsp; &nbsp; &nbsp; 4&nbsp; &nbsp;15&nbsp; &nbsp;b&nbsp; &nbsp;2&nbsp; &nbsp; &nbsp; 5&nbsp; &nbsp;26&nbsp; &nbsp;b&nbsp; &nbsp;2&nbsp; &nbsp; &nbsp; 6&nbsp; &nbsp;37&nbsp; &nbsp;b&nbsp; &nbsp;2&nbsp; &nbsp; &nbsp; 7&nbsp; &nbsp;4甚至:> ddply(mydf, .(IDA, IDB), transform, .id = seq_along(IDA))&nbsp; IDA IDB values .id1&nbsp; &nbsp;a&nbsp; &nbsp;1&nbsp; &nbsp; &nbsp; 1&nbsp; &nbsp;12&nbsp; &nbsp;a&nbsp; &nbsp;1&nbsp; &nbsp; &nbsp; 3&nbsp; &nbsp;23&nbsp; &nbsp;a&nbsp; &nbsp;2&nbsp; &nbsp; &nbsp; 2&nbsp; &nbsp;14&nbsp; &nbsp;b&nbsp; &nbsp;1&nbsp; &nbsp; &nbsp; 4&nbsp; &nbsp;15&nbsp; &nbsp;b&nbsp; &nbsp;2&nbsp; &nbsp; &nbsp; 5&nbsp; &nbsp;16&nbsp; &nbsp;b&nbsp; &nbsp;2&nbsp; &nbsp; &nbsp; 6&nbsp; &nbsp;27&nbsp; &nbsp;b&nbsp; &nbsp;2&nbsp; &nbsp; &nbsp; 7&nbsp; &nbsp;3请注意plyr没有最快的解决方案的美誉,因为你需要看一看data.table.这是一个data.table方法:library(data.table)DT <- data.table(mydf)DT[, .id := sequence(.N), by = "IDA,IDB"]DT#&nbsp; &nbsp; IDA IDB values .id# 1:&nbsp; &nbsp;a&nbsp; &nbsp;1&nbsp; &nbsp; &nbsp; 1&nbsp; &nbsp;1# 2:&nbsp; &nbsp;a&nbsp; &nbsp;2&nbsp; &nbsp; &nbsp; 2&nbsp; &nbsp;1# 3:&nbsp; &nbsp;a&nbsp; &nbsp;1&nbsp; &nbsp; &nbsp; 3&nbsp; &nbsp;2# 4:&nbsp; &nbsp;b&nbsp; &nbsp;1&nbsp; &nbsp; &nbsp; 4&nbsp; &nbsp;1# 5:&nbsp; &nbsp;b&nbsp; &nbsp;2&nbsp; &nbsp; &nbsp; 5&nbsp; &nbsp;1# 6:&nbsp; &nbsp;b&nbsp; &nbsp;2&nbsp; &nbsp; &nbsp; 6&nbsp; &nbsp;2# 7:&nbsp; &nbsp;b&nbsp; &nbsp;2&nbsp; &nbsp; &nbsp; 7&nbsp; &nbsp;3

动漫人物

我需要经常这样做,并编写了一个函数,它的实现与以前的答案不同。我不知道哪一种解决办法最有效。idCounter&nbsp;<-&nbsp;function(x)&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;unlist(lapply(rle(x)$lengths,&nbsp;seq_len))}mydf$TripCounter&nbsp;<-&nbsp;idCounter(mydf$CustomerID)
打开App,查看更多内容
随时随地看视频慕课网APP