2013-10-18 55 views
5

Tôi có một khung dữ liệu bao gồm ID, điều này giống nhau cho mỗi phần tử trong một nhóm, hai thời gian biểu và khoảng thời gian giữa hai nhóm này. Một trong các đối tượng datetime là điểm đánh dấu thời gian có liên quan của tôi. Bây giờ tôi muốn có một tập hợp con của khung dữ liệu bao gồm mục nhập sớm nhất cho mỗi nhóm. Các mục (đặc biệt là khoảng thời gian) cần phải được giữ nguyên.Trả lại hàng đầu tiên của nhóm

Cách tiếp cận đầu tiên của tôi là sắp xếp khung theo 1. ID và 2. datetime có liên quan. Tuy nhiên, tôi không thể trả lại mục nhập đầu tiên cho mỗi nhóm mới.

Sau đó tôi đã xem xét aggregate() cũng như chức năng ddply() nhưng tôi không thể tìm thấy tùy chọn trong cả hai chỉ trả về mục nhập đầu tiên mà không áp dụng hàm tổng hợp cho giá trị khoảng thời gian.

Có cách nào (dễ) để thực hiện việc này không?

BỔ SUNG: Có thể tôi không rõ ràng bằng cách thêm các ghi chú tổng hợp() và ddply() của mình. Tôi không nhất thiết phải tổng hợp. Do thực tế rằng các khung dữ liệu được sắp xếp theo cách mà hàng đầu tiên của mỗi nhóm mới là hàng tôi đang tìm kiếm, nó sẽ đủ để chỉ trả về một tập hợp con với mỗi hàng có một ID khác với một trước (đó là dòng bắt đầu của mỗi nhóm mới).

dữ liệu Ví dụ:

structure(list(ID = c(1454L, 1322L, 1454L, 1454L, 1855L, 1669L, 
1727L, 1727L, 1488L), Line = structure(c(2L, 1L, 3L, 1L, 1L, 
1L, 1L, 1L, 1L), .Label = c("A", "B", "C"), class = "factor"), 
    Start = structure(c(1357038060, 1357221074, 1357369644, 1357834170, 
    1357913412, 1358151763, 1358691675, 1358789411, 1359538400 
    ), class = c("POSIXct", "POSIXt"), tzone = ""), End = structure(c(1357110430, 
    1357365312, 1357564413, 1358230679, 1357978810, 1358674600, 
    1358853933, 1359531923, 1359568151), class = c("POSIXct", 
    "POSIXt"), tzone = ""), Interval = c(1206.16666666667, 2403.96666666667, 
    3246.15, 6608.48333333333, 1089.96666666667, 8713.95, 2704.3, 
    12375.2, 495.85)), .Names = c("ID", "Line", "Start", "End", 
"Interval"), row.names = c(NA, -9L), class = "data.frame") 
+2

Vui lòng cung cấp một ví dụ tái sản xuất với dữ liệu mẫu, tốt nhất là sử dụng 'dput'. – juba

+1

'tổng hợp (cols_to_aggregate ~ grouping_var, yourdata, head, 1)' có thể làm những gì bạn cần. – A5C1D2H2I1M1N2O1R2T1

+0

@AnandaMahto Ah, tốt đẹp, tôi luôn luôn quên về hình thức công thức của 'aggregate'. – juba

Trả lời

9

Bằng cách tái tạo khung dữ liệu ví dụ và thử nghiệm nó tôi tìm thấy một cách để nhận được kết quả cần thiết:

  1. thứ tự dữ liệu theo các cột có liên quan (ID, Bắt đầu)

    ordered_data <- data[order(data$ID, data$Start),]

  2. Tìm hàng đầu tiên cho mỗi ID mới

    final <- ordered_data[!duplicated(ordered_data$ID),]

8

Như bạn không cung cấp bất kỳ dữ liệu, đây là một ví dụ sử dụng cơ sở R với một khung dữ liệu mẫu:

df <- data.frame(group=c("a", "b"), value=1:8) 
## Order the data frame with the variable of interest 
df <- df[order(df$value),] 
## Aggregate 
aggregate(df, list(df$group), FUN=head, 1) 

EDIT: Như Ananda gợi ý trong nhận xét của mình, cuộc gọi sau đây tới aggregate là tốt hơn:

aggregate(.~group, df, FUN=head, 1) 
.210

Nếu bạn thích sử dụng plyr, bạn có thể thay aggregate với ddply:

ddply(df, "group", head, 1) 
+1

Cảm ơn bạn! Tôi nghĩ chức năng "đầu" là những gì tôi đang tìm kiếm. Tuy nhiên, áp dụng hàm tổng hợp hoặc hàm ddply cả hai đều gặp sự cố R. –

+1

@ user2035177 Đó là lý do tại sao chúng tôi yêu cầu bạn đăng một ví dụ có thể tái sản xuất - tốt nhất là chúng tôi chỉ có thể đoán được vấn đề là gì. Lấy 10 hàng dữ liệu của bạn, ngụy trang ID và thêm một số nhiễu vào thời gian biểu. Voila, một tập dữ liệu công cộng. –

+0

Đã cung cấp. Cũng như một cách giải quyết vấn đề của tôi. Cảm ơn đã giúp đỡ. Hy vọng điều này cũng sẽ hữu ích cho người khác. –

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