2013-05-05 2 views
9

У меня есть фрейм данных DF с одним из столбцов: дата/время и я хотел бы заказать кадр данных в порядке убывания этой колонки.Дата и время заказа в порядке убывания в R

DF <- data.frame(ID=c('ID3', 'ID2','ID1'), end=c('4/1/10 12:00', '6/1/11 14:20', '1/1/09 11:10'), age=c(40,30,20)); 

Я первый преобразовал end колонки в et с использованием et = as.POSIXct(DF$end,format='%m/%d/%Y %H:%M'), и использовал следующий, но получил ошибку, что унарный оператор «-» не принимаются в качестве аргумента:

out <- DF[order(-DF$et),]; 

Я также попытался использовал флаг нисходящего, но снова получил сообщение об ошибке, когда аргументы не были одинаковой длины.

out <- DF[order(DF$et, descending=TRUE),]; 

Однако, по возрастанию, кажется, работает: out <- DF[order(DF$et),].

Как сделать заказ в порядке убывания (самое последнее время)? Спасибо.

+1

Нет аргумента под названием 'убывание'. Это «убывание». –

+1

Поскольку вы новичок здесь, вы можете прочитать [** о **] (http://stackoverflow.com/about) и [** faq **] (http://stackoverflow.com/faq) о том, как работает SO. StackOverflow сделан ** намного более ценным для всех, если, когда вы получаете ответ, который решает вашу проблему, вы принимаете его, нажимая маленькую галочку. Вы абсолютно не обязаны делать это, но это отличный способ «вернуть» сайту, если ответ действительно решит вашу проблему и поможет сохранить сайт в чистоте, удалив ответ на вопрос с неотвеченный вопрос. –

ответ

6

Я думаю, что это будет работать:

## Slightly bigger dataset with two times on same day: 
DF <- data.frame(ID=c('ID3', 'ID2','ID1','ID4'), end=c('4/1/10 12:00', '6/1/11 14:20', '1/1/09 11:10' , '1/1/09 13:11'), age=c(40,30,20,20)); 

## Note to self - ALWAYS include a timezone. 
DF$DTime <- as.POSIXct(DF$end , format = "%d/%m/%y %H:%M" , tz = "GMT") 
DF[ order(DF$DTime , decreasing = TRUE),] 
# ID   end age    DTime 
#2 ID2 6/1/11 14:20 30 2011-01-06 14:20:00 
#1 ID3 4/1/10 12:00 40 2010-01-04 12:00:00 
#4 ID4 1/1/09 13:11 20 2009-01-01 13:11:00 
#3 ID1 1/1/09 11:10 20 2009-01-01 11:10:00 
+0

Будет ли это правильно сортировать строки с того же дня, но в разное время? – joran

+2

Как насчет 'DF [rev (order (DF $ end)),]'? – joran

+0

@joran вы правы. 'POSIXct' лучше (я думаю). –

6

Существует простой и общее решение для вашей проблемы с несколькими кодом.

Как вы заметили, знак минус не работает с датами, потому что отрицательных дат еще нет!

Однако вы можете иметь тот же эффект с функцией общего назначения: rev(). Таким образом, вы смешиваете изм и порядок, как:

#init data 
DF <- data.frame(ID=c('ID3', 'ID2','ID1'), end=c('4/1/10 12:00', '6/1/11 14:20', '1/1/09 11:10') 
#change order 
out <- DF[rev(order(as.Date(DF$end))),] 

При использовании минус с числами вы причислять отрицательные числа в один проход. Я думаю, что когда вы используете функцию rev(), вы делаете два прохода, один для сортировки в порядке возрастания и один для изменения порядка. Но на 3 наблюдениях это трудно понять.

Надеюсь, это помогло.

Смежные вопросы