ein data.table
wie Gegeben:Unerwartete .GRP Sequenz in data.table
library(data.table)
n = 5000
set.seed(123)
pop = data.table(id=1:n, age=sample(18:80, n, replace=TRUE))
und eine Funktion, die einen numerischen Vektor in eine geordnete Faktor wandelt, wie zum Beispiel:
toAgeGroups <- function(x){
groups=c('Under 40','40-64','65+')
grp = findInterval(x, c(40,65)) +1
factor(groups[grp], levels=groups, ordered=TRUE)
}
Ich sehe unerwartete Ergebnisse beim Gruppieren der Ausgabe dieser Funktion als Schlüssel und Indizieren mit .GRP
.
pop[, .(age_segment_id = .GRP, pop_count=.N), keyby=.(age_segment = toAgeGroups(age))]
kehrt:
age_segment age_segment_id pop_count
1: Under 40 1 1743
2: 40-64 3 2015
3: 65+ 2 1242
Ich habe die age_segment_id
Werte zu erwarten wäre c(1,2,3)
, nicht c(1,3,2)
, aber .GRP
scheint sich auf der Reihenfolge des Auftretens in den zugrunde liegenden Daten zu sein (wie in by=
Reihenfolge) statt sortiert Bestellung (wie in keyby=
).
Ich plante auf .GRP
als Index für einige zusätzliche Kennzeichnung verwenden, sondern brauche ich, wie etwas zu tun:
pop[, .(pop_count=.N), keyby=.(age_segment = toAgeGroups(age))][, age_segment_id := .I][]
zu bekommen, was ich will.
Ist das erwartete Verhalten? Wenn ja, gibt es eine bessere Problemumgehung?
(v. 1.9.6)
Ihre 'toAgeGroups' Funktion durch die' base' Funktion subsumiert ' Schnitt ', nein? – MichaelChirico