【问题标题】:R remove all rows within a timeframe in a dataframeR删除数据框中时间范围内的所有行
【发布时间】:2017-10-19 23:42:06
【问题描述】:

我有一个包含两列的数据框。

第一列是POSIXct,第二列是num:

        date                value
    1   09.05.2017 10:30    0.72599362
    2   09.05.2017 10:31    0.6942953
    3   09.05.2017 10:32    0.6913402
    4   09.05.2017 10:33    0.7219035
    5   09.05.2017 10:34    0.7484892
    6   09.05.2017 10:35    0.7566694
    7   09.05.2017 10:36    0.7699520
    8   09.05.2017 10:37    0.7863227
    9   09.05.2017 10:38    0.7955254
    10  09.05.2017 10:39    0.7724675
    11  09.05.2017 10:40    0.7883882
    12  09.05.2017 10:41    0.7975705
    13  09.05.2017 10:42    0.7842776
    14  09.05.2017 10:43    0.7705962
    15  09.05.2017 10:44    0.7607595
    16  09.05.2017 10:45    0.7658722
    17  09.05.2017 10:46    0.7617003
    18  09.05.2017 10:47    0.7536121
    19  09.05.2017 10:48    0.7493686
    ...

我需要两次删除 5 分钟内的所有条目。这意味着我只想显示每 5 分钟的行。

期望的结果:

        date                value
    1   09.05.2017 10:30    0.72599362
    2   09.05.2017 10:35    0.7566694
    3   09.05.2017 10:40    0.7883882
    4   09.05.2017 10:45    0.7658722

中间的行应该被完全删除。

我想像这样使用 cut:

    dfResult <- cut(dfResult$date, "5 min")

但由于某种原因,cut 函数不会从数据框中删除条目

所以我正在考虑使用带有剪切的聚合。但是聚合总是带有 sum 或 mean 之类的函数,这也不是我想要的。

    dfResult <- aggregate(. ~ cut(dfResult$date, "5 min"), 
                           dfResult[setdiff(names(dfResult), "date")], sum)

上面的行做了它应该做的,但使用 sum 作为聚合函数。有没有类似的功能可以简单地删除两者之间的条目?

谢谢!!

【问题讨论】:

    标签: r date time aggregate cut


    【解决方案1】:

    如果 date 是 POSIXct 类,您可以使用模运算符 (%%) 仅返回五分钟的模返回 0 的行。

    鉴于此数据框(仅包含可重复性 - 只要您的日期列是 POSIXct 对象,您就不需要这样做):

    df <- structure(list(date = structure(c(1504632600, 1504632660, 1504632720, 
    1504632780, 1504632840, 1504632900, 1504632960, 1504633020, 1504633080, 
    1504633140, 1504633200, 1504633260, 1504633320, 1504633380, 1504633440, 
    1504633500, 1504633560, 1504633620, 1504633680), class = c("POSIXct", 
    "POSIXt"), tzone = ""), value = c(0.72599362, 0.6942953, 0.6913402, 
    0.7219035, 0.7484892, 0.7566694, 0.769952, 0.7863227, 0.7955254, 
    0.7724675, 0.7883882, 0.7975705, 0.7842776, 0.7705962, 0.7607595, 
    0.7658722, 0.7617003, 0.7536121, 0.7493686)), .Names = c("date", 
    "value"), row.names = c(NA, -19L), class = "data.frame")
    

    只返回所需的行:

    df[which(as.numeric(x$date) %% (60 * 5) == 0 ),]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-06-24
      • 1970-01-01
      • 2020-08-16
      • 2022-01-26
      • 2022-12-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多