代码之家  ›  专栏  ›  技术社区  ›  Oumab10

基于行索引的数据帧拆分

  •  1
  • Oumab10  · 技术社区  · 8 年前

    我想通过循环行和子集来拆分数据帧

    indices = (diff(Data$Time>1800))
    for (i in 1:length(indices)){
    if(indices[i]==TRUE){
    ##### I need a function to split data by row index
    }}
    

    我试过了

    lst <- split(Data, as.factor(diff(Data$Time>1800)==TRUE))
    

    但它只返回为true的行,但我想要的是每次它面对true时进行拆分。

    这就是我所拥有的

        Time        temp
    7/1/17 13:45:34  56
    7/1/17 13:45:37  68
    7/1/17 13:45:39  98
    7/1/17 13:45:40  99
    7/1/17 13:45:46  97
    7/1/17 14:16:29  48
    7/1/17 14:16:30  78
    7/1/17 14:16:31  66
    7/1/17 14:17:34  93
    7/1/17 14:17:39  98
    7/1/17 14:17:40  98
    7/1/17 14:17:44  93
    7/1/17 14:47:10  54
    7/1/17 14:47:12  67
    7/1/17 14:47:16  69
    7/1/17 14:47:18  95
    7/1/17 14:47:19  95
    7/1/17 14:47:23  96
    7/1/17 14:47:28  96
    7/1/17 14:47:30  99
    

    这就是我想要的

    Time        temp
    7/1/17 13:45:34  56
    7/1/17 13:45:37  68
    7/1/17 13:45:39  98
    7/1/17 13:45:40  99
    7/1/17 13:45:46  97
    
    Time        temp
    7/1/17 14:16:29  48
    7/1/17 14:16:30  78
    7/1/17 14:16:31  66
    7/1/17 14:17:34  93
    7/1/17 14:17:39  98
    7/1/17 14:17:40  98
    7/1/17 14:17:44  93
    
    Time        temp
    7/1/17 14:47:10  54
    7/1/17 14:47:12  67
    7/1/17 14:47:16  69
    7/1/17 14:47:18  95
    7/1/17 14:47:19  95
    7/1/17 14:47:23  96
    7/1/17 14:47:28  96
    7/1/17 14:47:30  99
    

    是否可以通过将这些索引存储在一个向量中,然后基于该向量拆分数据帧来拆分数据,这意味着每当行号等于我们的值“i”时,就会在该行拆分数据帧。以便具有多个数据帧。

    1 回复  |  直到 8 年前
        1
  •  1
  •   akrun    8 年前

    有了新的数据集,看起来应该是1700,而不是1800

    library(dplyr)
    library(purrr)
    library(lubridate)
    Data %>% 
        mutate(Time = dmy_hms(Time), 
               grp = cumsum(Time - lag(Time, default = Time[1L])> 1700)) %>%
        split(.$grp) %>% 
        map(~ .x %>%
                select(-grp))
    #$`0`
    #                 Time temp
    #1 2017-01-07 13:45:34   56
    #2 2017-01-07 13:45:37   68
    #3 2017-01-07 13:45:39   98
    #4 2017-01-07 13:45:40   99
    #5 2017-01-07 13:45:46   97
    
    #$`1`
    #                  Time temp
    #6  2017-01-07 14:16:29   48
    #7  2017-01-07 14:16:30   78
    #8  2017-01-07 14:16:31   66
    #9  2017-01-07 14:17:34   93
    #10 2017-01-07 14:17:39   98
    #11 2017-01-07 14:17:40   98
    #12 2017-01-07 14:17:44   93
    
    #$`2`
    #                  Time temp
    #13 2017-01-07 14:47:10   54
    #14 2017-01-07 14:47:12   67
    #15 2017-01-07 14:47:16   69
    #16 2017-01-07 14:47:18   95
    #17 2017-01-07 14:47:19   95
    #18 2017-01-07 14:47:23   96
    #19 2017-01-07 14:47:28   96
    #20 2017-01-07 14:47:30   99
    

    类似选项 base R 可能是

    split(Data, cumsum(c(0, diff(as.POSIXct(Data$Time,
                 format = "%d/%m/%y %H:%M:%S", tz = 'GMT'))) > 1700))