R语言:计算DataFrame中隔行时间差值的方法
计算DataFrame中每两行一组的时间差值
没问题,我来帮你搞定这个隔行时间差计算的需求~首先先确认你的DataFrame结构,先把数据加载进来:
# 加载你的DataFrame df <- structure(list(MemId = c(1, 2, 3, 4, 5,6), ET = structure(c(1506829256, 1506829319, 1506843096,1506843226, 1506850144, 1506853708), class = c("POSIXct", "POSIXt"))), .Names = c("MemId", "ET"), row.names = c("1", "2", "14", "15", "37", "38"), class = "data.frame")
查看数据的样子:
> df MemId ET 1 1 2017-10-01 09:10:56 2 2 2017-10-01 09:11:59 14 3 2017-10-01 13:01:36 15 4 2017-10-01 13:03:46 37 5 2017-10-01 14:59:04 38 6 2017-10-01 15:58:28
接下来提供两种实用的计算方式:
方法一:Base R 直接索引计算
因为你的数据刚好是偶数行,我们可以直接通过索引选取每一组的后一行和前一行,然后做减法:
# 提取偶数行的ET减去奇数行的ET,得到每组的时间差 time_diff <- df$ET[seq(2, nrow(df), 2)] - df$ET[seq(1, nrow(df), 2)] # 查看结果(默认以秒为单位) time_diff # 输出: # Time differences in secs # [1] 63 130 3564
如果需要把结果整理成更清晰的表格,可以这样做:
result <- data.frame( 组编号 = paste0("组", 1:(nrow(df)/2)), 用户ID对 = paste(df$MemId[seq(1, nrow(df), 2)], df$MemId[seq(2, nrow(df), 2)], sep = "-"), 时间差 = time_diff ) print(result) # 输出: # 组编号 用户ID对 时间差 # 1 组1 1-2 63 secs # 2 组2 3-4 130 secs # 3 组3 5-6 3564 secs
方法二:用dplyr分组处理(适合复杂场景)
如果你习惯用tidyverse的语法,或者后续需要更灵活的分组操作,可以用dplyr来实现:
library(dplyr) df %>% # 给每两行分配一个组号 mutate(组编号 = rep(1:(nrow(df)/2), each = 2)) %>% # 按组分组 group_by(组编号) %>% # 计算每组的用户ID对和时间差 summarise( 用户ID对 = paste(MemId, collapse = "-"), 时间差 = last(ET) - first(ET) ) %>% # 取消分组 ungroup()
额外技巧:转换时间差单位
默认的时间差是difftime类型,你可以转换成数值或者修改单位:
# 转换成分钟 as.numeric(time_diff, units = "mins") # 输出:[1] 1.050000 2.166667 59.400000 # 转换成小时 as.numeric(time_diff, units = "hours") # 输出:[1] 0.01750000 0.03611111 0.99000000
内容的提问来源于stack exchange,提问作者Apricot
相关产品推荐
相关产品推荐

