R语言 如何在R中按组计算与数据框前一行的时间差

R语言 如何在R中按组计算与数据框前一行的时间差

一个数据框架可能由属于组的不同值组成。列可以有属于不同数据类型的值,或作为POSIXct对象的时间框架。这些对象允许轻松地应用数学运算,可以通过以下方式进行。

方法1:使用dplyr包

group_by方法是用来根据特定列中包含的组来划分和隔离日期的。需要分组的列被指定为这个函数的参数。它可以包含多个列名。

语法

group_by(col1, col2, …)

接下来是应用mutate()方法,用于转移方向和对数据进行操作。可以使用新的列名来指定新的列名。与前一行的差异可以通过这个库的lag()方法来计算。这个方法可以找到一个向量中的前一个值。

语法。

lag(x, n = 1L, default = NA)

参数:

  • x – 一个值的向量
  • n – 要滞后的位置数
  • default (默认:NA)–用于不存在的行的值。

任何组的第一次出现都会被NA值取代。

例子

library(dplyr)
 
# creating a dataframe
data_frame <- data.frame(col1 = sample(6:9, 5 , replace = TRUE),
                         col3 =  c(as.POSIXct("2021-05-08 08:32:07"),
                                   as.POSIXct("2021-07-18 00:21:07"),
                                   as.POSIXct("2020-11-28 23:32:09"),
                                   as.POSIXct("2021-05-11 18:32:07"),
                                   as.POSIXct("2021-05-08 08:32:07"))
                         )
print ("Original DataFrame")
print (data_frame)
 
# computing difference of each group
data_frame %>%
  arrange(col1, col3) %>%
  group_by(col1) %>%
  mutate(diff = col3 - lag(col3))

输出

[1] "Original DataFrame" 
   col1                col3
1    8 2021-05-08 08:32:07 
2    8 2021-07-18 00:21:07 
3    7 2020-11-28 23:32:09 
4    6 2021-05-11 18:32:07 
5    7 2021-05-08 08:32:07 
# A tibble: 5 x 3 
# Groups:   col1 [3]    
           col1 col3                diff            
         <int> <dttm>              <drtn>        
1     6 2021-05-11 18:32:07       NA secs 
2     7 2020-11-28 23:32:09       NA secs 
3     7 2021-05-08 08:32:07 13856398 secs 
4     8 2021-05-08 08:32:07       NA secs 
5     8 2021-07-18 00:21:07  6104940 secs

方法2:使用tapply方法

tapply()方法被用来在列表或数据框架对象上应用一个函数。指定的函数,可以是用户定义的,也可以是预先定义的,被应用于数据框架对象的每个单元格。

语法。

tapply(X, INDEX, FUN )

参数 :

  • X – 一个R对象,一个数据框架。通常是矢量的,允许用[.]进行子设置。
  • INDEX – 一个或多个因子的列表,每个因子的长度与X相同,这些元素通过as.factor被强制转换成因子。
  • FUN – 一个要应用的函数

在这种情况下,该函数是计算时间框架的差异,单位是秒。在一个组中遇到的所有数值的第一个实例都被替换为零。

例子

# creating a dataframe
data_frame <- data.frame(col1 = sample(6:9, 5 , replace = TRUE),
                         col3 =  c(as.POSIXct("2021-05-08 08:32:07"),
                                   as.POSIXct("2021-07-18 00:21:07"),
                                   as.POSIXct("2020-11-28 23:32:09"),
                                   as.POSIXct("2021-05-11 18:32:07"),
                                   as.POSIXct("2021-05-08 08:32:07"))
                         )
print ("Original DataFrame")
print (data_frame)
 
# computing difference of each group
data_framediff <- unlist(tapply(data_framecol3, INDEX = data_frame$col1,
                          FUN = function(x) c(0, `units<-`(diff(x), "secs"))))
                                  
print ("Modified DataFrame")
print (data_frame)

输出

[1] "Original DataFrame" 
col1                col3 
1    7 2021-05-08 08:32:07 
2    6 2021-07-18 00:21:07 
3    8 2020-11-28 23:32:09 
4    7 2021-05-11 18:32:07 
5    6 2021-05-08 08:32:07 
[1] "Modified DataFrame" 
col1                col3     diff 
1    7 2021-05-08 08:32:07        0 
2    6 2021-07-18 00:21:07 -6104940 
3    8 2020-11-28 23:32:09        0 
4    7 2021-05-11 18:32:07   295200 
5    6 2021-05-08 08:32:07        0

方法3:使用data.table

可以添加一个新的列来计算data.table中各行的时间差。difftime()方法可以用来计算这个差异。它是用来计算时间间隔或差异的。

语法。

difftime (t1 , t2 , units)

参数:

  • t1, t2 – 日期时间或日期对象。
  • units – 以字符串形式表示的单位,用于返回结果

为了找到下一个时区值,即在difftime()中应用的t2,shift()方法被用来在指定的输入向量或列表中诱发提前或滞后。

语法。

shift (x , fill )

参数:

  • x – 矢量、列表、数据框或数据表。
  • fill – 要引入的填充值的指标

by属性被添加到按指定列名的数据组中。

例子

library("data.table")
 
# creating a dataframe
dt <- data.table(col1 = sample(6:9, 5 , replace = TRUE),
                         col3 =  c(as.POSIXct("2021-05-08 08:32:07"),
                                   as.POSIXct("2021-07-18 00:21:07"),
                                   as.POSIXct("2020-11-28 23:32:09"),
                                   as.POSIXct("2021-05-11 18:32:07"),
                                   as.POSIXct("2021-05-08 08:32:07"))
                         )
print ("Original DataFrame")
print (dt)
 
# computing difference of each group
dt[, diff := difftime(col3, shift(col3, fill=col3[1L]),
                      units="secs"), by=col1]
 
print ("Modified DataFrame")
print (dt)

输出

[1] "Original DataFrame" 
col1                col3 
1:    7 2021-05-08 08:32:07 
2:    7 2021-07-18 00:21:07 
3:    8 2020-11-28 23:32:09 
4:    8 2021-05-11 18:32:07 
5:    8 2021-05-08 08:32:07 
[1] "Modified DataFrame" 
col1                col3         diff 
1:    7 2021-05-08 08:32:07        0 secs 
2:    7 2021-07-18 00:21:07  6104940 secs 
3:    8 2020-11-28 23:32:09        0 secs 
4:    8 2021-05-11 18:32:07 14151598 secs 
5:    8 2021-05-08 08:32:07  -295200 secs

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程