2016-01-08 9 views
5

Così, ho il seguente data.tableCome ordinare una data.table utilizzando un vettore di destinazione

DT = data.table(x=rep(c("b","a","c"),each=3), y=c(1,2,3)) 

> DT 
    x y 
1: b 1 
2: b 2 
3: b 3 
4: a 1 
5: a 2 
6: a 3 
7: c 1 
8: c 2 
9: c 3 

E ho il seguente vettore

k <- c("2","3","1") 

voglio usare k come vettore di destinazione per ordinare DT utilizzando e ottenere qualcosa di simile.

> DT 
    x y 
1: b 2 
2: a 2 
3: c 2 
4: b 3 
5: a 3 
6: c 3 
7: b 1 
8: a 1 
9: c 1 

Qualche idea? Se uso DT[order(k)] ottengo un sottoinsieme dei dati originali e non è quello che sto cercando.

risposta

7

Lanciare una chiamata a match() lì.

DT[order(match(y, as.numeric(k)))] 
# x y 
# 1: b 2 
# 2: a 2 
# 3: c 2 
# 4: b 3 
# 5: a 3 
# 6: c 3 
# 7: b 1 
# 8: a 1 
# 9: c 1 

realtà DT[order(match(y, k))] avrebbe funzionato così, ma è probabilmente più sicuro per rendere gli argomenti da match() della stessa classe per ogni evenienza.

Nota:match() in alcuni casi è sub-ottimale. Se si dispone di un numero elevato di righe, è possibile passare a fastmatch::fmatch per una corrispondenza più rapida.

2

Si può fare questo:

DT = data.table(x=rep(c("b","a","c"),each=3), y=c(1,2,3)) 
k <- c("2","3","1") 
setkey(DT,y) 
DT[data.table(as.numeric(k))] 

o (dal commento di Richard)

DT = data.table(x=rep(c("b","a","c"),each=3), y=c(1,2,3)) 
k <- c("2","3","1") 
DT[data.table(y = as.numeric(k)), on = "y"] 
+1

Al giorno d'oggi si può solo fare 'DT [data.table (y = as.numeric (k)), on = "y"] 'per unire su' y' e non dover impostare una chiave –