【问题标题】:Compare row on same column比较同一列上的行
【发布时间】:2018-10-31 09:40:29
【问题描述】:

我有一个如下的data.frame:

x=data.frame(Time=c("2017-09-01 09:21:03","2018-05-05 05:58:59","2018-01-01 12:06:46",
                    "2017-09-01 09:21:11","2018-01-01 12:10:12","2018-05-05 05:55:50"),
                     First=c("X1","X2","X3","X1","X3","X2"),
                     Second=c("A1","A2","B3","A1","B3","C4"))
output:
        Time                First     Second
 1   2017-09-01 09:21:03      X1        A1
 2   2018-05-05 05:58:59      X2        A2
 3   2018-01-01 12:06:46      X3        B3
 4   2017-09-01 09:23:11      X1        A1
 5   2018-01-01 12:20:12      X3        B3
 6   2018-05-05 05:55:50      X2        C4

我想比较如果当前行与下一行(在同一列上),

而且时差不到5分钟,

将生成一个新的数据帧并计算相同的次数

得到:

First      Second     n
 X1          A1       2   #(original row 1 and row 4)
 X2          A2       1   #(original row 2)
 X3          B3       1   #(original row 3)
 X3          B3       1   #(original row 5)
 X2          C4       1   #(original row 6)

因为第 3 行和第 5 行之间的时间超过 5 分钟,所以记录不同。

并且第1行和第4行之间的时间小于5分钟,所以记录相同

找到了一篇stackoverflow的文章,但还是不知道怎么写。

R compare current row to the next row (on same column)

【问题讨论】:

    标签: r


    【解决方案1】:

    我是用dplyr 到达那里的。有点难以获得预期的结果。我希望有一个更简单的方法。也许有更好的data.table 知识的人可以提供data.table 解决方案。

    基本上首先创建一个组语句来计算以分钟为单位的时间差,如果小于 5 分钟设置为 0。这样可以确保 5 分钟内的记录得到相同的分钟。接下来摆脱时间并扩展分组以包括分钟。计算有多少记录属于这些组。从分组中删除分钟,做一个distinct去除X1 A1的双重记录,最后删除min列。

    library(dplyr)
    
    df %>% 
      group_by(First, Second) %>% 
      mutate(min = (Time - lag(Time, default = first(Time)))/60,
             min = ifelse(min < 5, 0, min)) %>% 
      select(-Time) %>% 
      group_by(First, Second, min) %>% 
      mutate(n = n()) %>% 
      ungroup(min) %>% 
      distinct() %>% 
      select(-min)
    
    # A tibble: 5 x 3
      First Second     n
      <chr> <chr>  <int>
    1 X1    A1         2
    2 X2    A2         1
    3 X3    B3         1
    4 X3    B3         1
    5 X2    C4         1
    

    数据:

    df <- structure(list(Time = structure(c(1504250463, 1525492739, 1514804806, 1504250591, 1514805612, 1525492550), 
                                          class = c("POSIXct", "POSIXt"), tzone = ""), 
                         First = c("X1", "X2", "X3", "X1", "X3", "X2"), 
                         Second = c("A1", "A2", "B3", "A1", "B3", "C4")), 
                    .Names = c("Time", "First", "Second"), 
                    row.names = c(NA, -6L), 
                    class = "data.frame")
    

    【讨论】:

    • 谢谢。我会尝试,我想我需要了解更多关于 dplyr 的信息。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多