2014-06-11 13 views
7

Ho un sondaggio in cui un ID univoco deve essere assegnato alle domande. Alcune domande appaiono più volte. Ciò significa che c'è un ulteriore livello di domande. Nei dati di esempio qui sotto è incluso solo il primo strato.Livelli del fattore ordine in ordine di apparizione nel set di dati

Domanda: come si assegna un indice univoco per ordine di apparizione? La soluzione fornita here funziona in ordine alfabetico. Posso ordinare i fattori, ma questo sconfigge lo scopo di farlo in R [ci sono molte domande da ordinare].

library(data.table) 
dt = data.table(question = c("C", "C", "A", "B", "B", "D"), 
       value = c(10,20,30,40,20,30)) 

dt[, idx := as.numeric(as.factor(question))] 

dà:

question value idx 
# 1:  C 10 3 
# 2:  C 20 3 
# 3:  A 30 1 
# 4:  B 40 2 
# 5:  B 20 2 
# 6:  D 30 4 

# but required is: 
dt[, idx.required := c(1, 1, 2, 3, 3, 4)] 

risposta

8

Penso che il modo data.table per fare questo sarà

dt[, idx := .GRP, by = question] 

## question value idx 
## 1:  C 10 1 
## 2:  C 20 1 
## 3:  A 30 2 
## 4:  B 40 3 
## 5:  B 20 3 
## 6:  D 30 4 
+0

+1 per LukeA ma questo è davvero più compatto. Entrambe le soluzioni funzionano. – Henk

+0

Che cosa è 'idx: = .GRP'? – Superbest

6

Si potrebbe specificare nuovamente i livelli di fattore:

dt[, idx := as.numeric(factor(question, levels=unique(question)))] 
# question value idx 
# 1:  C 10 1 
# 2:  C 20 1 
# 3:  A 30 2 
# 4:  B 40 3 
# 5:  B 20 3 
# 6:  D 30 4