R: Bagaimana cara memesan pengukuran per jam per hari dari awal hingga akhir dan menambahkan nomor sesuai pesanan ini?

Saya memiliki kerangka data ini bagian yang jauh lebih besar:

[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  

Kolom pertama berisi tanggal, dan kolom kedua berisi waktu pada tanggal tersebut pengukuran dilakukan (misalnya: 0,0 = jam 00:00 dan 0,5 = jam 12:00). Seperti yang Anda lihat, beberapa tanggal memiliki lebih dari satu pengukuran.

Inilah yang ingin saya lakukan: Saya ingin mengurutkan data waktu per tanggal dari rendah ke tinggi pada hari tertentu dan menambahkan angka sesuai dengan urutan ini (1 adalah pengukuran paling awal, setelah itu 2...3 dst. Untuk mendapatkan sesuatu seperti ini:

[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

Adakah yang tahu cara melakukan ini? Bantuan akan sangat bagus!


person MB123    schedule 10.05.2013    source sumber
comment
sudahkah kamu melihat ?order? Sesuatu seperti yourdata[order(yourdata[,1], yourdata[,2]),]. Namun, saya sarankan mengonversi kolom tanggal dan waktu Anda ke salah satu tipe data datetime di R.   -  person Justin    schedule 10.05.2013
comment
Itu matriks, bukan data.frame. data.frames harus memiliki nama baris, sedangkan objek Anda tidak.   -  person Joshua Ulrich    schedule 10.05.2013


Jawaban (2)


Anda dapat order data.frame Anda dan kemudian menggunakan ave untuk membuat kolom ketiga dengan sangat cepat:

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 mengambil subset dari kerangka data Anda dan mengembalikan vektor untuk setiap subset dari 1 hingga nrow(x) dengan x adalah subset saat ini. Ia mengembalikannya sebagai satu vektor panjang yang kita lampirkan ke data.frame dan kemudian mengurutkannya berdasarkan kolom tanggal V1 dalam contoh saya dan kemudian kolom ID.

person Simon O'Hanlon    schedule 10.05.2013
comment
Saya rasa Anda harus order terlebih dahulu memenuhi persyaratan OP - person James; 10.05.2013
comment
@James ya, Anda benar, terima kasih atas tempatnya. Saya telah memperbarui pesanan. - person Simon O'Hanlon; 10.05.2013

Anda dapat menggunakan ddply dalam paket 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

Anda akan melihat bahwa saya memanggil ddply dua kali: sekali untuk mengurutkan keluaran awal pada 2 variabel (order bisa saja digunakan di sini), dan kedua kalinya untuk mengubahnya dengan menambahkan variabel urutan (yang hanya bergantung pada 1 variabel, date) .

person James    schedule 10.05.2013