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