【问题标题】:Extract data between two pattern occurrences提取两个模式出现之间的数据
【发布时间】:2014-02-14 11:24:57
【问题描述】:

我正在尝试提取两种模式出现之间的数据。 IE。如果模式出现子集所有数据,直到该模式再次出现。然后我需要给这个子集一个数字,以便它可以被识别

使用(R)

示例数据:

DF<-(structure(list(date.time = structure(c(1374910680, 1374911040, 
                                   1374911160, 1374911580, 1374913380, 1374913500, 1374913620, 1374913740, 
                                   1374914160, 1374914400, 1374914520, 1374914940, 1374915000, 1374915120, 
                                   1374915240), class = c("POSIXct", "POSIXt"), tzone = ""), aerial = structure(c(2L, 
                                                                                                                  2L, 8L, 8L, 2L, 2L, 2L, 8L, 8L, 8L, 2L, 2L, 8L, 2L, 2L), .Label = c("0", 
                                                                                                                                                                                      "1", "10", "11", "2", "3", "4", "5", "6", "7", "8", "9", "m"), class = "factor")), .Names = c("date.time", 
                                                                                                                                                                                                                                                                                    "aerial"), row.names = c(1L, 2L, 3L, 4L, 5L, 
                                                                                                                                                                                                                                                                                                            6L, 7L, 8L, 9L, 10L, 11L, 12L, 13L, 
                                                                                                                                                                                                                                                                                                             14L, 15L), class = "data.frame") )

示例模式:DF$aerial 重复 1,1

从上面我想子集/提取模式出现之间的数据,然后给这个模式的出现次数一个可识别的数字(即这是第一次出现,这是第二次出现等等)

想要的输出:

         date.time       aerial    occurrence
3  2013-07-27 08:46:00      5          1
4  2013-07-27 08:53:00      5          1
8  2013-07-27 09:29:00      5          2
9  2013-07-27 09:36:00      5          2
10 2013-07-27 09:40:00      5          2
13 2013-07-27 09:50:00      5          3

我可以识别模式:

require(zoo)
library(zoo)

pat <- c(1,1)

x <- rollapply(DF$aerial, length(pat), FUN=function(x) all(x == pat))

DF[which(x),]

显然我可以创建一个 is.between 函数

is.between <- function(x, a, b) {
x > a & x < b
}

但是在这之后我卡住了,

注意:模式之间的数据不一定都是航拍5,这是为了简化例子

非常感谢您的帮助和指点!

【问题讨论】:

    标签: r pattern-matching between


    【解决方案1】:

    似乎排除所有至少为 2 长的 1 的运行就足够了,所以试试这个:

    library(zoo)
    
    a <- as.numeric(as.character(DF$aerial))
    r <- rle(a)
    cond <- with(r, values != 1 | lengths < 2)
    ok <- rep(cond, r$lengths)
    occur <- rep(cumsum(cond), r$lengths)
    cbind(DF, occur)[ok, ]
    

    给出:

                 date.time aerial occur
    3  2013-07-27 03:46:00      5     1
    4  2013-07-27 03:53:00      5     1
    8  2013-07-27 04:29:00      5     2
    9  2013-07-27 04:36:00      5     2
    10 2013-07-27 04:40:00      5     2
    13 2013-07-27 04:50:00      5     3
    

    修订:添加occur

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-01-13
      • 1970-01-01
      • 2017-07-30
      • 1970-01-01
      • 1970-01-01
      • 2018-11-23
      • 2017-12-08
      相关资源
      最近更新 更多