【问题标题】:Filter for the datetimes that has gap greater than or equal to a number - R过滤具有大于或等于数字的间隔的日期时间 - R
【发布时间】:2016-10-17 01:24:47
【问题描述】:

假设我有一个如下的数据框,

ID  date           difference
1   5/1/2016 4:46   NA
2   5/1/2016 4:55   9
3   5/1/2016 5:01   6
4   5/1/2016 5:09   8
5   5/1/2016 5:16   7
6   5/1/2016 5:24   8
7   5/1/2016 5:31   7
8   5/1/2016 5:40   9
9   5/1/2016 5:46   6
10  5/1/2016 5:49   3
11  5/1/2016 5:54   5
12  5/1/2016 5:57   3
13  5/1/2016 6:10   13

这里我想过滤时差大于或等于9的条目。我想过滤时差值为9之前的两个条目,之后过滤一个条目。基本上我想分析时差大于 9 分钟时的趋势。所以我想在它之前取两个条目,在它之后取一个条目,这样我将有 4 个条目来调查每个时间块条目。

我可以直接用一个条目过滤它,

data %>% filter(difference >= 9) 

但我想在它之前取两个条目,在它之后取一个条目来调查。理想情况下,我的输出应该是,

ID  date           difference
1   5/1/2016 4:46   NA
2   5/1/2016 4:55   9
3   5/1/2016 5:01   6
6   5/1/2016 5:24   8
7   5/1/2016 5:31   7
8   5/1/2016 5:40   9
9   5/1/2016 5:46   6
11  5/1/2016 5:54   5
12  5/1/2016 5:57   3
13  5/1/2016 6:10   13

每当时差大于或等于 9 时,我会在条目之前得到两个,在条目之后得到一个。

谁能告诉我如何处理这个问题?

谢谢

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    注意:我为“日期”使用了一个占位符系列,因为它在这段代码的上下文中并不重要。

    据我所知,没有一种单一命令的方式可以满足您的需求。我建议使用循环来执行此操作:

    df <- data.frame(1:13)
    df <- cbind(df,2000:2012,c(NA,9,6,8,7,8,7,9,6,3,5,3,13))
    colnames(df) <- c("ID","date","difference")
    
    whichAtLeast9 <- which(df$difference >= 9)
    wantedRows <- whichAtLeast9
    
    for (i in whichAtLeast9) {
      entries_before <- c(i-1,i-2)
      entries_before <- subset(entries_before,entries_before>0)
      wantedRows <- append(wantedRows,entries_before)
      entries_after <- i+1
      entries_after <- subset(entries_after,entries_after<=13)
      wantedRows <- append(wantedRows,entries_after)
    }
    
    # Remove duplicates and sort.
    wantedRows <- sort(unique(wantedRows))
    
    finaldf <- df[wantedRows,]
    

    结果:

    > finaldf
       ID date difference
    1   1 2000         NA
    2   2 2001          9
    3   3 2002          6
    6   6 2005          8
    7   7 2006          7
    8   8 2007          9
    9   9 2008          6
    11 11 2010          5
    12 12 2011          3
    13 13 2012         13
    

    【讨论】:

      【解决方案2】:

      你可以试试data.table中的shiftReduce方法,假设dt是你的data.frame:

      library(data.table)
      setDT(dt)
      dt[Reduce("|", c(shift(difference >= 9, n = 0:1, type = "lag"), 
                       shift(difference >=9, n = 1:2, type = "lead")))]
      
                ID date difference
       1: 5/1/2016 4:46         NA
       2: 5/1/2016 4:55          9
       3: 5/1/2016 5:01          6
       4: 5/1/2016 5:24          8
       5: 5/1/2016 5:31          7
       6: 5/1/2016 5:40          9
       7: 5/1/2016 5:46          6
       8: 5/1/2016 5:54          5
       9: 5/1/2016 5:57          3
      10: 5/1/2016 6:10         13
      

      【讨论】:

      • 感谢这个。这行得通.. 但是如果我想以前按任何变量分组并递归执行,我该怎么做?
      • 例如,我不想将前几天作为以前的记录来获取,所以我按天分组,在这种情况下,我只想要特定cay中的条目,我不想去前一天的记录。所以我在这里按天分组,然后想这样做。
      • 在这种情况下,您可以尝试dt[, .SD[Reduce("|", c(shift(difference &gt;= 9, n = 0:1, type = "lag"), shift(difference &gt;=9, n = 1:2, type = "lead")))], by = list(ID)]。其中ID 是组变量。
      • ID是要分组的变量吗?
      • 是的,ID是组变量。
      猜你喜欢
      • 2011-07-08
      • 2013-06-25
      • 1970-01-01
      • 2019-02-28
      • 1970-01-01
      • 1970-01-01
      • 2014-03-31
      • 1970-01-01
      • 2020-02-13
      相关资源
      最近更新 更多