Р: Как заказать почасовые измерения в день от раннего до позднего и добавить число в соответствии с этим порядком?

У меня есть эта часть фрейма данных гораздо большего размера:

[7111,] 20100321  0.8000000  
[7112,] 20100321  0.1000000  
[7113,] 20100322  0.3000000  
[7114,] 20100324  0.4000000  
[7115,] 20100324  0.2000000  
[7116,] 20100325  0.4000000  
[7117,] 20100326  0.7000000  
[7118,] 20100327  0.4000000 
[7119,] 20100328  0.1000000  
[7120,] 20100328  0.9000000  
[7121,] 20100328  0.2000000   
[7122,] 20100329  0.7000000  

Первый столбец содержит дату, а второй столбец - момент времени в эту дату, когда было произведено измерение (например: 0,0 = 00:00 часов и 0,5 = 12:00 часов). Как видите, некоторые даты имеют более одного измерения.

Это то, что я хочу сделать: я хочу упорядочить данные времени для каждой даты от минимума к большему в конкретный день и добавить число в соответствии с этим порядком (1 - это самое раннее измерение, после этого 2 ... 3 и т. Д. получится что-то вроде этого:

[7111,] 20100321  0.1000000    1  
[7112,] 20100321  0.8000000    2
[7113,] 20100322  0.3000000    1
[7114,] 20100324  0.2000000    1
[7115,] 20100324  0.4000000    2
[7116,] 20100325  0.4000000    1
[7117,] 20100326  0.7000000    2
[7118,] 20100327  0.4000000    1
[7119,] 20100328  0.1000000    1
[7120,] 20100328  0.2000000    2
[7121,] 20100328  0.9000000    3
[7122,] 20100329  0.7000000    1

Кто-нибудь знает как это сделать? Помогите было бы здорово!


person MB123    schedule 10.05.2013    source источник
comment
ты смотрел ?order? Что-то вроде yourdata[order(yourdata[,1], yourdata[,2]),]. Однако вместо этого я бы предложил преобразовать ваши столбцы даты и времени в один из типов данных datetime в R.   -  person Justin    schedule 10.05.2013
comment
Это матрица, а не data.frame. data.frames должны иметь rownames, которых нет у вашего объекта.   -  person Joshua Ulrich    schedule 10.05.2013


Ответы (2)


Вы можете order свой data.frame, а затем использовать ave для очень быстрого создания третьего столбца:

df <- df [ order( df$V1 , df$V2 ) , ]
df$ID <- ave( df$V2 , df$V1 , FUN = function(x) 1:length(x) )
#        V1  V2 ID
#2  20100321 0.1  1
#1  20100321 0.8  2
#3  20100322 0.3  1
#5  20100324 0.2  1
#4  20100324 0.4  2
#6  20100325 0.4  1
#7  20100326 0.7  1
#8  20100327 0.4  1
#9  20100328 0.1  1
#11 20100328 0.2  2
#10 20100328 0.9  3
#12 20100329 0.7  1

ave берет подмножества вашего фрейма данных и возвращает вектор для каждого подмножества от 1 до nrow(x), где x - текущее подмножество. Он возвращает их как один длинный вектор, который мы присоединяем к data.frame, а затем сортируем по столбцу даты V1 в моем примере, а затем по столбцу ID.

person Simon O'Hanlon    schedule 10.05.2013
comment
Я думаю, вы должны order сначала выполнить требования OP - person James; 10.05.2013
comment
@ Джеймс, да, ты прав, спасибо за место. Я обновил заказ. - person Simon O'Hanlon; 10.05.2013

Вы можете использовать ddply в пакете plyr:

library(plyr)
ddply(ddply(x,c("date","time"),identity),"date",transform,order=seq_along(date))
       date time order
1  20100321  0.1     1
2  20100321  0.8     2
3  20100322  0.3     1
4  20100324  0.2     1
5  20100324  0.4     2
6  20100325  0.4     1
7  20100326  0.7     1
8  20100327  0.4     1
9  20100328  0.1     1
10 20100328  0.2     2
11 20100328  0.9     3
12 20100329  0.7     1

Вы заметите, что я вызываю ddply дважды: один раз, чтобы упорядочить начальный вывод для двух переменных (вместо этого можно было бы использовать order), и второй раз, чтобы преобразовать его, добавив переменную порядка (которая зависит только от 1 переменной, date) .

person James    schedule 10.05.2013