返回第一行组

时间:2013-10-18 13:33:19

标签: r aggregate plyr

我有一个由ID组成的数据框,对于组中的每个元素都是相同的,两个日期时间以及这两者之间的时间间隔。其中一个日期时间对象是我的相关时间标记。现在我想获得数据帧的子集,其中包含每个组的最早条目。条目(尤其是时间间隔)需要保持不变。

我的第一种方法是根据1. ID和2.相关日期时间对帧进行排序。但是,我无法返回每个新组的第一个条目。

然后我一直在查看aggregate()以及ddply()函数,但是我找不到两个选项,只返回第一个条目而不将聚合函数应用于时间间隔值。

是否有(简单)方法来实现这一目标?

此外: 也许我不清楚添加我的aggregate()和ddply()注释。我不一定需要聚合。鉴于数据帧的排序方式是每个新组的第一行是我要查找的行,只需返回一个子集,其中每一行的ID都与之前的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")

4 个答案:

答案 0 :(得分:15)

通过复制示例数据框并对其进行测试,我找到了获得所需结果的方法:

  1. 按相关列(ID,开始)订购数据

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

  2. 查找每个新ID的第一行

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

答案 1 :(得分:10)

由于您未提供任何数据,因此以下是使用带有示例数据框的基础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)

编辑:正如Ananda在评论中所说,以下对aggregate的呼吁更好:

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

如果您希望使用plyr,则可以将aggregate替换为ddply

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

答案 2 :(得分:0)

使用 ffirst 中的 collapse

library(collapse)
ffirst(df, g = df$group)

数据

df <- data.frame(group=c("a", "b"), value=1:8)

答案 3 :(得分:0)

这也可以通过使用 dplyrgroup_by-family 函数的 slice 来实现,

data %>%
        group_by(ID) %>%
        slice_head(n = 1)