使用多个变量创建计数器

10 counter r

我的数据如下所示:

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
Run Code Online (Sandbox Code Playgroud)

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

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 
Run Code Online (Sandbox Code Playgroud)

Tripcounter 将为每个客户.

A5C*_*2T1 13

使用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
Run Code Online (Sandbox Code Playgroud)

为了它的价值,我还在我的"splitstackshape"包中包含的函数中实现了这种方法的一个版本.该函数被称为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
Run Code Online (Sandbox Code Playgroud)

从上面的示例中可以看出,我以这样的方式编写函数,您可以指定一个或多个应被视为ID列的列.它检查是否有任何id.vars重复,如果是,那么它会为您生成一个新的ID变量.


Pau*_*tra 7

你也可以使用plyr它(使用@ AnadaMahto的示例数据):

> ddply(mydf, .(IDA), transform, .id = seq_along(IDA))
  IDA IDB values .id
1   a   1      1   1
2   a   2      2   2
3   a   1      3   3
4   b   1      4   1
5   b   2      5   2
6   b   2      6   3
7   b   2      7   4
Run Code Online (Sandbox Code Playgroud)

甚至:

> ddply(mydf, .(IDA, IDB), transform, .id = seq_along(IDA))
  IDA IDB values .id
1   a   1      1   1
2   a   1      3   2
3   a   2      2   1
4   b   1      4   1
5   b   2      5   1
6   b   2      6   2
7   b   2      7   3
Run Code Online (Sandbox Code Playgroud)

请注意,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
Run Code Online (Sandbox Code Playgroud)


rmu*_*uc8 5

同时,你也可以使用dplyr.如果你的data.frame被称为mydata

library(dplyr)
mydata %>% group_by(CustomerID) %>% mutate(TripCounter = row_number())
Run Code Online (Sandbox Code Playgroud)