2013-10-18 111 views
5

我有一個數據幀,包含一個ID,這對於一個組中的每個元素都是一樣的,兩個日期時間以及這兩者之間的時間間隔。其中一個日期時間對象是我的相關時間標記。現在我想獲取由每個組的最早條目組成的數據框的子集。條目(特別是時間間隔)需要保持不變。返回組的第一行

我的第一種方法是根據1. ID和2.相關日期時間對幀進行排序。但是,我無法返回每個新組的第一個條目。

然後我一直在尋找aggregate()以及ddply()函數,但是我找不到一個選項,它們只是返回第一個條目而沒有對時間間隔值應用聚合函數。

有沒有一個(簡單)的方法來完成這個?

ADDITION: 也許我不清楚加入我的aggregate()和ddply()的註釋。我不一定需要彙總。鑑於數據框的排序方式是每個新組的第一行是我要查找的行,只需返回一個子集,其中每行都具有與以前不同的ID(這是每個新組的起始行)。

實施例的數據:

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

請提供與樣本數據可再現例如優選使用'dput'。 – juba

+1

'聚合(cols_to_aggregate〜grouping_var,yourdata,head,1)'可以做你需要的。 – A5C1D2H2I1M1N2O1R2T1

+0

@AnandaMahto啊,很好,我總是忘記'聚合'的公式形式。 – juba

回答

9

通過再現示例數據幀並對其進行測試,我發現獲得所需結果的方式:

  1. 訂單通過相關列數據(ID,開始)

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

  2. 查找第一行對於每個新的ID

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

8

如你不提供任何數據,這裏是使用基礎R與樣品數據幀的示例:

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) 

編輯:作爲阿南達表明在他的評論中,以下呼籲aggregate更好:

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

如果你喜歡使用plyr,你可以用ddply替代aggregate

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

謝謝!我認爲「頭」功能是我正在尋找的。但是,應用聚合或ddply函數都會使R崩潰。 –

+1

@ user2035177這就是爲什麼我們要求你發佈一個可重複的例子 - 最好我們只能猜測問題是什麼。取10行數據,僞裝身份證,並在日期時間添加一些噪音。 Voila是一個公共數據集。 –

+0

提供。以及解決我的問題的一種方式。謝謝您的幫助。希望這對其他人也有幫助。 –