Vraag Tel het aantal records en genereer rijnummer binnen elke groep in een data.table


Ik heb de volgende data.table

set.seed(1)
DT <- data.table(VAL = sample(c(1, 2, 3), 10, replace = TRUE))
    VAL
 1:   1
 2:   2
 3:   2
 4:   3
 5:   1
 6:   3
 7:   3
 8:   2
 9:   2
10:   1

Binnen elk nummer in VAL Ik wil:

  1. Tel het aantal records / rijen
  2. Maak een rij-index (teller) van eerste, tweede, derde occurrence et c.

Aan het eind wil ik het resultaat

    VAL COUNT IDX
 1:   1     3   1
 2:   2     4   1
 3:   2     4   2
 4:   3     3   1
 5:   1     3   2
 6:   3     3   2
 7:   3     3   3
 8:   2     4   3
 9:   2     4   4
10:   1     3   3

waarbij "COUNT" het aantal records / rijen voor elke "VAL" is en "IDX" de rij-index binnen elke "VAL".

Ik probeerde ermee te werken which en length gebruik makend van .I:

 dt[, list(COUNT = length(VAL == VAL[.I]), 
             IDX = which(which(VAL == VAL[.I]) == .I))]

maar dit werkt niet zo .I verwijst naar een vector met de index, dus ik denk dat je die moet gebruiken .I[]. Hoewel van binnen .I[] Ik heb opnieuw het probleem onder ogen gezien, dat ik de rij-index niet heb en ik weet het (van lezen data.table Veelgestelde vragen en het volgen van de berichten hier) dat het doorlopen van rijen indien mogelijk moet worden vermeden.

Dus, wat is het data.table manier?


48
2017-11-08 21:50


oorsprong


antwoorden:


Gebruik makend van .N...

DT[ , `:=`( COUNT = .N , IDX = 1:.N ) , by = VAL ]
#    VAL COUNT IDX
# 1:   1     3   1
# 2:   2     4   1
# 3:   2     4   2
# 4:   3     3   1
# 5:   1     3   2
# 6:   3     3   2
# 7:   3     3   3
# 8:   2     4   3
# 9:   2     4   4
#10:   1     3   3

.N is het aantal records in elke groep, met groepen gedefinieerd door "VAL".


74
2017-11-08 21:53