2014-05-21 22 views
5

Tôi có một khung dữ liệu như sau. Ban đầu nó chỉ là hai cột/biến - "Dấu thời gian" (có chứa ngày và giờ) và "Diễn viên". Tôi đã phá vỡ xuống "Dấu thời gian" biến thành "ngày" và "thời gian" và sau đó "thời gian hơn nữa xuống 'giờ' và 'phút'. Điều này sau đó cung cấp cho các cơ cấu như sauSắp xếp và xếp hạng một khung dữ liệu theo ngày và giờ theo r

dataf<-structure(list(hours = structure(c(3L, 4L, 4L, 3L, 3L, 3L, 6L, 
6L, 6L, 6L, 6L, 2L, 2L, 2L, 2L, 5L, 5L, 5L, 1L, 1L, 2L, 2L), .Label = c("9", 
"12", "14", "15", "16", "17"), class = "factor"), mins = structure(c(17L, 
1L, 2L, 14L, 15L, 16L, 3L, 4L, 6L, 6L, 7L, 9L, 9L, 13L, 13L, 
10L, 11L, 12L, 2L, 5L, 8L, 8L), .Label = c("00", "04", "08", 
"09", "10", "12", "13", "18", "19", "20", "21", "22", "27", "39", 
"51", "52", "59"), class = "factor"), date = structure(c(3L, 
3L, 3L, 3L, 3L, 3L, 2L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 4L, 4L, 
4L, 1L, 1L, 1L, 1L), .Label = c("4/28/2014", "5/18/2014", "5/2/2014", 
"5/6/2014"), class = "factor"), time = structure(c(7L, 8L, 9L, 
4L, 5L, 6L, 13L, 14L, 15L, 15L, 16L, 2L, 2L, 3L, 3L, 10L, 11L, 
12L, 17L, 18L, 1L, 1L), .Label = c("12:18", "12:19", "12:27", 
"14:39", "14:51", "14:52", "14:59", "15:00", "15:04", "16:20", 
"16:21", "16:22", "17:08", "17:09", "17:12", "17:13", "9:04", 
"9:10"), class = "factor"), Timestamp = structure(c(13L, 14L, 
15L, 10L, 11L, 12L, 6L, 7L, 8L, 8L, 9L, 2L, 2L, 3L, 3L, 16L, 
17L, 18L, 4L, 5L, 1L, 1L), .Label = c("4/28/2014 12:18", "4/28/2014 12:19", 
"4/28/2014 12:27", "4/28/2014 9:04", "4/28/2014 9:10", "5/18/2014 17:08", 
"5/18/2014 17:09", "5/18/2014 17:12", "5/18/2014 17:13", "5/2/2014 14:39", 
"5/2/2014 14:51", "5/2/2014 14:52", "5/2/2014 14:59", "5/2/2014 15:00", 
"5/2/2014 15:04", "5/6/2014 16:20", "5/6/2014 16:21", "5/6/2014 16:22" 
), class = "factor"), Actor = c(7L, 7L, 7L, 7L, 7L, 7L, 5L, 5L, 
2L, 12L, 2L, 7L, 7L, 7L, 7L, 10L, 10L, 10L, 7L, 10L, 7L, 7L)), .Names = c("hours", 
"mins", "date", "time", "Timestamp", "Actor"), row.names = c(NA, 
-22L), class = "data.frame")  

Lý do để phá vỡ các dấu thời gian và biến thời gian thành các biến riêng biệt là bởi vì trong dữ liệu thực của tôi, tôi đã có rất nhiều vấn đề khi sắp xếp theo dữ liệu và/hoặc thời gian.Thay đổi các biến này thành các phần nhỏ hơn đã làm cho việc sắp xếp dễ dàng hơn nhiều. thích làm bây giờ là tạo một biến mới có tên là "Xếp hạng", sẽ trả về '1' cho sự kiện sớm nhất trong khung dữ liệu (sẽ là quan sát lúc 9,04 sáng ngày 28 tháng 4 năm 2014), sau đó là '2' cho quan sát tiếp theo trong ngày/giờ orde r và vân vân.

Phân loại các dataframe dường như là tương đối tầm thường:

dataf<-dataf[order(as.Date(dataf$date, format="%m/%d/%Y"), dataf$hours, dataf$mins),] 

này không được công việc. Nhưng những gì tôi đang đấu tranh với bây giờ là phân công các cấp bậc.

Tôi cố gắng này, bởi vì tôi đã sử dụng 'ave' kết hợp với FUN = bậc để xếp hạng số nguyên, nhưng những gì nó tạo ra là nực cười sai:

dataf$rank <- ave((dataf[order(as.Date(dataf$date, format="%m/%d/%Y"), dataf$hours, dataf$mins),]),FUN=rank) 

bất kỳ sự giúp đỡ đánh giá cao

+0

Không phải 'dataf $ rank <- rank (dataf $ Timestamp)' đủ? – sgibb

+0

@sgibb OP đã làm cho cuộc sống khá khó khăn bằng cách lưu trữ mọi thứ dưới dạng các yếu tố, thay vì sử dụng các đối tượng ngày tháng và datetime, vì một lý do nào đó. Và có tem thời gian trùng lặp, vì vậy chúng tôi thậm chí không thể chỉ bước bên vấn đề đó và nói để làm 'seq_len (nrow (dataf))'. – joran

Trả lời

2

tôi không chia sẻ sự ác cảm của bạn với các đối tượng ngày giờ, điều này làm cho điều này đơn giản hơn nhiều:

dataf$ts <- strptime(as.character(dataf$Timestamp),'%m/%d/%Y %H:%M') 
dataf <- dataf[order(dataf$ts),] 
dataf$ts_rank <- rank(dataf$ts,ties.method = "min") 
dataf 
## hours mins  date time  Timestamp Actor     ts ts_rank 
## 19  9 04 4/28/2014 9:04 4/28/2014 9:04  7 2014-04-28 09:04:00  1 
## 20  9 10 4/28/2014 9:10 4/28/2014 9:10 10 2014-04-28 09:10:00  2 
## 21 12 18 4/28/2014 12:18 4/28/2014 12:18  7 2014-04-28 12:18:00  3 
## 22 12 18 4/28/2014 12:18 4/28/2014 12:18  7 2014-04-28 12:18:00  3 
## 12 12 19 4/28/2014 12:19 4/28/2014 12:19  7 2014-04-28 12:19:00  5 
## 13 12 19 4/28/2014 12:19 4/28/2014 12:19  7 2014-04-28 12:19:00  5 
## 14 12 27 4/28/2014 12:27 4/28/2014 12:27  7 2014-04-28 12:27:00  7 
## 15 12 27 4/28/2014 12:27 4/28/2014 12:27  7 2014-04-28 12:27:00  7 
## 4  14 39 5/2/2014 14:39 5/2/2014 14:39  7 2014-05-02 14:39:00  9 
## 5  14 51 5/2/2014 14:51 5/2/2014 14:51  7 2014-05-02 14:51:00  10 
## 6  14 52 5/2/2014 14:52 5/2/2014 14:52  7 2014-05-02 14:52:00  11 
## 1  14 59 5/2/2014 14:59 5/2/2014 14:59  7 2014-05-02 14:59:00  12 
## 2  15 00 5/2/2014 15:00 5/2/2014 15:00  7 2014-05-02 15:00:00  13 
## 3  15 04 5/2/2014 15:04 5/2/2014 15:04  7 2014-05-02 15:04:00  14 
## 16 16 20 5/6/2014 16:20 5/6/2014 16:20 10 2014-05-06 16:20:00  15 
## 17 16 21 5/6/2014 16:21 5/6/2014 16:21 10 2014-05-06 16:21:00  16 
## 18 16 22 5/6/2014 16:22 5/6/2014 16:22 10 2014-05-06 16:22:00  17 
## 7  17 08 5/18/2014 17:08 5/18/2014 17:08  5 2014-05-18 17:08:00  18 
## 8  17 09 5/18/2014 17:09 5/18/2014 17:09  5 2014-05-18 17:09:00  19 
## 9  17 12 5/18/2014 17:12 5/18/2014 17:12  2 2014-05-18 17:12:00  20 
## 10 17 12 5/18/2014 17:12 5/18/2014 17:12 12 2014-05-18 17:12:00  20 
## 11 17 13 5/18/2014 17:13 5/18/2014 17:13  2 2014-05-18 17:13:00  22 
+0

Cảm ơn rất nhiều - Tôi không còn có ác cảm với Dấu thời gian nữa. Để đảm bảo rằng cột ts_rank có thứ hạng duy nhất (nghĩa là không có thứ hạng nào có thể được chia sẻ, đó là điều mà dữ liệu của tôi cần) - Tôi đã đi với: dataf $ ts_rank <- rank (dataf $ ts, ties.method = "random") – jalapic

+0

@jalapic Hoan hô! – joran

Các vấn đề liên quan