2016-01-08 14 views
5

Tak, mam następujący data.tableJak sortować data.table stosując wektor docelowy

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 

I mam następujący Vector,

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

chcę użyć jako k wektor docelowy do sortowania DT przy użyciu y i uzyskaj coś takiego.

> 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 

Jakieś pomysły? Jeśli użyję DT[order(k)], otrzymam podzestaw oryginalnych danych i nie jest to tym, czego szukam.

Odpowiedz

7

tam wywołać match().

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 

Właściwie DT[order(match(y, k))] będzie działać jak dobrze, ale to chyba najbezpieczniejsza, aby argumenty do match() z tej samej klasy, na wszelki wypadek.

Uwaga: W niektórych przypadkachmatch() jest podoptymalny. Jeśli masz dużą liczbę wierszy, możesz przełączyć się na fastmatch::fmatch dla szybszego dopasowania.

2

Można to zrobić:

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))] 

lub (z komentarzem Ryszarda)

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

Obecnie można tylko zrobić 'DT [data.table (y = as.numeric (k)), on = "y"] ', aby scalić na' y' i nie trzeba ustawiać klucza –