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