按分组变量查找日期差异

时间:2017-08-17 23:22:48

标签: r date group-by

我正在研究我的硕士论文,并需要一些R编码的帮助。我正在分析野生火鸡在繁殖的不同阶段的运动。我需要找到个人在某个区域内的最后日期和第一个日期的差异。

x<- data.frame(
AreaID = c(1,1,1,1,2,2,2,2),
Timestamp=as.POSIXct(c("06/01/2014 05:01", "6/01/2014 13:00","06/01/2014 23:00", "06/02/2014 10:00","06/20/2015 09:00",
"06/20/2015 10:00", "06/20/2015 11:00", "06/20/2015 12:00"), format='%m/%d/%Y %H:%M'))

我需要一个具有AreaID的新数据框以及在该区域内花费的时间。

感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

library(dplyr)
group_by(x, AreaID) %>%
    summarize(duration = max(Timestamp) - min(Timestamp))
# # A tibble: 2 x 2
#   AreaID      duration
#    <dbl>        <time>
# 1      1 1.207639 days
# 2      2 3.000000 days

答案 1 :(得分:0)

@Gregor的dplyr解决方案应该有效。但是,如果dplyr无法正常运行。您可以使用data.table尝试该方法。

library(data.table)

setDT(x)
x[, .(duration = max(Timestamp) - min(Timestamp)), by = AreaID]
   AreaID      duration
1:      1 1.207639 days
2:      2 3.000000 days

或使用基础R的aggregate功能。

aggregate(Timestamp ~ AreaID, data = x, FUN = function(x) max(x) - min(x))
  AreaID Timestamp
1      1 1.207639 
2      2 3.000000

更新

为了使时间单位保持一致,我们可以使用difftime函数和units参数,这可能是&#34;小时&#34;,&#34;天&#34;或其他单位。

aggregate(Timestamp ~ AreaID, data = x, 
          FUN = function(x) difftime(max(x), min(x), units = "hours"))

  AreaID Timestamp
1      1 28.98333 
2      2  3.00000