Crear contador con múltiples variables [duplicado]

Resuelto asked hace 54 años • 6 respuestas

Tengo mis datos que se ven a continuación:

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

Necesito crear una variable de contador, que será como a continuación:

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 

Tripcounterserá para cada cliente.

 avatar Jan 01 '70 08:01
Aceptado

Usar ave. Suponiendo que data.framese llama "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

Por si sirve de algo, también implementé una versión de este enfoque en una función incluida en mi paquete "splitstackshape". La función se llama 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

Como puede ver en el ejemplo anterior, escribí la función de tal manera que pueda especificar una o más columnas que deben tratarse como columnas de ID. Comprueba si alguno de ellos id.varsestá duplicado y, si lo está, genera una nueva variable de ID para usted.

A5C1D2H2I1M1N2O1R2T1 avatar Aug 28 '2013 11:08 A5C1D2H2I1M1N2O1R2T1

También puedes usar plyrpara esto (usando los datos de ejemplo de @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

o incluso:

> 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

Tenga en cuenta que plyrno tiene fama de ser la solución más rápida, para eso debe echarle un vistazo data.table.


He aquí un data.tableenfoque:

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
Paul Hiemstra avatar Aug 30 '2013 08:08 Paul Hiemstra