una seleccionar por ordenar matriz filas data como columnas columna r sorting data.table

seleccionar - order data frame r



Reordenar filas en data.table en un orden específico (2)

Esta capacidad no es (todavía) exportada. Después de ver la fuente de setorderv , pude extraer la función requerida de llamada a C que hace lo que necesita y suministrarla con un orden personalizado.

library(data.table) set.seed(123) dumdt <- data.table(v1=sample(1:10, 5), v2=1:5) print(dumdt) # v1 v2 #1: 3 1 #2: 8 2 #3: 4 3 #4: 7 4 #5: 6 5 setroworder <- function(x, neworder) { .Call(data.table:::Creorder, x, as.integer(neworder), PACKAGE = "data.table") invisible(x) } to_ord <- c(3, 5, 2, 1, 4) setroworder(x=dumdt, neworder=to_ord) print(dumdt) # v1 v2 #1: 4 3 #2: 6 5 #3: 8 2 #4: 3 1 #5: 7 4

Sin embargo, la solución propuesta por Frank se ve un poco mejor.

Tengo un data.table dumdt :

set.seed(123) dumdt <- data.table(v1=sample(1:10, 5), v2=1:5)

cuyas filas me gustaría reordenar en este orden de índices específicos (primero la tercera observación, luego la quinta, luego la segunda, etc.):

to_ord <- c(3, 5, 2, 1, 4)

Así que me gustaría que dumdt sea ​​el resultado de dumdt[to_ord] pero también me gustaría hacerlo por referencia y evitar hacer dumdt <- dumdt[to_ord] .

Sé que puedo reordenar las filas por referencia con setorder (o setorderv ) pero solo de acuerdo con una o varias variables, en orden ascendente o descendente, no en un orden personalizado.
Sin embargo, si quisiera reordenar las columnas, no las filas, en un orden personalizado, podría usar setcolorder .

Entonces, aquí viene mi pregunta: ¿existe una función que funcione como setcolorder pero con las filas (o una forma de usar setorder para hacer lo mismo)?

Mi salida deseada sería algo como

setroworder(x=dumdt, neworder=to_ord) dumdt # v1 v2 # 1: 4 3 # 2: 6 5 # 3: 8 2 # 4: 3 1 # 5: 7 4


Si entiendo correctamente, puedes agregar una columna y luego ordenar por ella:

setorder(dumdt[, .r := order(to_ord)], .r)[, .r := NULL] v1 v2 1: 4 3 2: 6 5 3: 8 2 4: 3 1 5: 7 4