คำตอบ: จะสั่งการวัดรายชั่วโมงต่อวันตั้งแต่เช้าไปสายแล้วบวกตัวเลขตามคำสั่งซื้อนี้ได้อย่างไร

ฉันมีส่วนของ dataframe ที่ใหญ่กว่านี้มาก:

[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]),] อย่างไรก็ตาม ฉันขอแนะนำให้แปลงคอลัมน์วันที่และเวลาของคุณเป็นประเภทข้อมูลวันที่และเวลาประเภทใดประเภทหนึ่งใน R   -  person Justin    schedule 10.05.2013
comment
นั่นคือเมทริกซ์ ไม่ใช่ data.frame data.frames ต้องมีชื่อแถว ซึ่งออบเจ็กต์ของคุณไม่มี   -  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 รับชุดย่อยของ dataframe ของคุณและส่งกลับเวกเตอร์สำหรับชุดย่อยแต่ละชุดตั้งแต่ 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
@James ใช่คุณพูดถูก ขอบคุณสำหรับประเด็น ฉันได้อัพเดตคำสั่งซื้อแล้ว - 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 สองครั้ง: ครั้งแรกเพื่อเรียงลำดับเอาต์พุตเริ่มต้นของตัวแปร 2 ตัว (สามารถใช้ order ที่นี่แทนได้) และครั้งที่สองเพื่อแปลงมันโดยการเพิ่มตัวแปรลำดับ (ซึ่งขึ้นอยู่กับ 1 ตัวแปรเท่านั้น date) .

person James    schedule 10.05.2013