【问题标题】:Returning first row of group返回组的第一行
【发布时间】:2013-10-18 13:33:19
【问题描述】:

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

我的第一种方法是根据 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")

【问题讨论】:

  • 请提供带有样本数据的可重现示例,最好使用dput
  • aggregate(cols_to_aggregate ~ grouping_var, yourdata, head, 1) 可能会满足您的需求。
  • @AnandaMahto 啊,太好了,我总是忘记aggregate的公式形式。
  • 您好,谢谢!提供可重复的示例很困难,因为数据并不意味着公开。我会看看我是否可以创建一些示例。但是,总体问题似乎已被理解。

标签: r aggregate plyr


【解决方案1】:

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

  1. 按相关列(ID、开始)对数据进行排序

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

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

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

【讨论】:

    【解决方案2】:

    由于您不提供任何数据,这里是一个使用基本 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,可以将aggregate 替换为ddply

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

    【讨论】:

    • 谢谢!我认为“头”功能是我正在寻找的。但是,应用聚合函数或 ddply 函数都会导致 R 崩溃。
    • @user2035177 这就是为什么我们要求您发布可重现的示例 - 充其量我们只能猜测问题所在。获取 10 行数据,伪装 ID,并在日期时间中添加一些噪音。瞧,一个公共数据集。
    • 提供。以及解决我的问题的一种方式。谢谢您的帮助。希望这对其他人也有帮助。
    • 作为一个小警告,数百万行的长时间运行操作将需要一些时间并冻结 RGui。 RGui 仍会偶尔响应一次,但不会接受 R 控制台中的输入。
    【解决方案3】:

    使用来自collapseffirst

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

    数据

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

    【讨论】:

      【解决方案4】:

      这也可以通过dplyr 使用group_byslice-family 函数来实现,

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

      【讨论】:

        猜你喜欢
        • 2016-01-14
        • 1970-01-01
        • 1970-01-01
        • 2017-07-09
        • 1970-01-01
        • 2014-12-14
        • 2021-03-23
        • 2018-06-03
        • 1970-01-01
        相关资源
        最近更新 更多