2015-01-19 2 views
1

У меня есть данные, подобные этим:Заказать dataframe для заданных столбцов

data <- data.frame(x1=rexp(10,2),y1=rnorm(10,1),x2=rexp(10,2),y2=rnorm(10,1),x3=rexp(10,2),y3=rnorm(10,1),x4=rexp(10,2),y4=rnorm(10,1)) 

Я хотел бы заказать все y1,y2... переменные в порядке возрастания.

Я попытался это, среди прочего:

data[with(data,order(y1,y2,y3,y4,decreasing=FALSE)), ] 

Существует ряд SO вклад, например here о порядке, но я не могу заставить его работать.

+0

В чем проблема с тем, что было в ссылке? – akrun

+0

Только первый столбец 'y1' является порядком не остальным' y2 ... ' – Maximilian

+0

Если порядок значений в столбцах' x' тоже изменяется? –

ответ

3

С data.table пакета можно либо сортировать по ссылке и пройти несколько имен переменных сразу к функции setorder (эта функция не упоминается в ссылке выше)

library(data.table) 
setorderv(setDT(data), grep("^y\\d+", names(data), value = TRUE)) 

Если вы хотите decreasind заказ вы можете указать order, например,

setorderv(setDT(data), grep("^y\\d+", names(data), value = TRUE), order = -1L) 

самое приятное об этом, является то, что вы можете передать весь вектор в order, который будет сортировать каждую колонку по-разному, например

indx <- c(1L, -1L, -1L, 1L) 
setorderv(setDT(data), grep("^y\\d+", names(data), value = TRUE), order = indx) 

Хотя все делается по ссылке (без создания копий с помощью <-)

+0

Как вы меняете заказ на 'уменьшение = TRUE' здесь? – akrun

+0

Спасибо, это имеет смысл. – akrun

+0

@akrun см. мое редактирование. –

0

Я думаю, что приведенное решение делает именно то, что он должен делать - сначала сортируйте по y1, затем (для тех же y1-значений) на y2 и так далее.

Если вы хотите, чтобы каждая пара x-y сортировалась независимо, вам необходимо разбить data.frame.

data.frame(data[with(data,order(y1,decreasing=FALSE)),c('x1', 'y1') ], 
     data[with(data,order(y2,decreasing=FALSE)),c('x2', 'y2') ], 
     data[with(data,order(y3,decreasing=FALSE)),c('x3', 'y3') ], 
     data[with(data,order(y4,decreasing=FALSE)),c('x4', 'y4') ]) 
+0

Спасибо, но у меня слишком много столбцов, чтобы сделать это вручную! – Maximilian

4

Вы можете попробовать

indx <- do.call(order, c(data[grep('^y', names(data))], decreasing=TRUE)) 
data[indx,] 

По умолчанию, параметр есть decreasing=FALSE. Если это то, что вы хотели, просто сделайте

indx <- do.call(order, data[grep('^y', names(data))]) 
Смежные вопросы