R 汇总日期时间,以汇总在特定时间花费的时间';重复';条件

R 汇总日期时间,以汇总在特定时间花费的时间';重复';条件,r,date,datetime,dplyr,summary,R,Date,Datetime,Dplyr,Summary,你好 这是一个继续的问题 以下是一些虚拟数据: Date <- as.POSIXct(c('2018-03-20 11:52:25', '2018-03-22 12:01:44', '2018-03-20 12:05:25', '2018-03-20 12:10:40', '2018-03-20 12:12:51 ', '2018-03-21 2:01:23', '2018-03-21 2:45:01', '2018-03-21 3:30:00', '2018-03-21 3:45:00'

你好

这是一个继续的问题

以下是一些虚拟数据:

Date <- as.POSIXct(c('2018-03-20 11:52:25', '2018-03-22 12:01:44', '2018-03-20 12:05:25', '2018-03-20 12:10:40', '2018-03-20 12:12:51 ', '2018-03-21 2:01:23', '2018-03-21 2:45:01', '2018-03-21 3:30:00', '2018-03-21 3:45:00', '2018-03-21 5:00:00', '2018-03-21 5:45:00')) 
Sites<-c(4, 4, 4, 6, 6, 7, 7, 4, 4, 6, 6)
Individual<-c("A", "A", "A", "A", "A", "A", "A", "A", "A", "A","A")

data<-data.frame(Individual, Date, Sites)

   Individual                Date Sites
           A 2018-03-20 11:52:25     4
           A 2018-03-22 12:01:44     4
           A 2018-03-20 12:05:25     4
           A 2018-03-20 12:10:40     6
           A 2018-03-20 12:12:51     6
           A 2018-03-21 02:01:23     7
           A 2018-03-21 02:45:01     7
           A 2018-03-21 03:30:00     4
           A 2018-03-21 03:45:00     4
           A 2018-03-21 05:00:00     6
           A 2018-03-21 05:45:00     6
Dates<-as.POSIXct(c("2018-04-09 16:59:03",
"2018-04-09 18:27:23",
"2018-04-09 17:01:20",
"2018-04-09 17:41:17"))
Individual<-c("A","A","A","A")
Site<-c("40","40","40", "40")

data<-data.frame(Dates, Individual, Site)

Date经过编辑的解决方案:经过一些尝试和错误,这就是最终的效果。这使用了
data.table
中的函数,因此需要安装该函数

步骤1:为所有现场观测(按现场)创建唯一ID,按日期排序

    data %>%
      arrange(Individuals, Dates) %>%
      mutate(rle_id = data.table::rleid(Sites))

                 Dates Individuals Sites rle_id
1  2018-03-20 11:52:25           A    38      1
2  2018-04-09 16:43:44           A    38      1
3  2018-04-09 16:59:03           A    40      2
4  2018-04-09 17:01:20           A    40      2
5  2018-04-09 17:41:17           A    40      2
6  2018-04-09 18:27:23           A    40      2
7  2018-03-20 11:52:25           B     4      3
8  2018-03-20 12:05:25           B     4      3
9  2018-03-20 12:10:40           B     6      4
10 2018-03-20 12:12:51           B     6      4
11 2018-03-21 02:01:23           B     7      5
12 2018-03-21 02:45:01           B     7      5
13 2018-03-21 03:30:00           B     4      6
14 2018-03-21 03:45:00           B     4      6
15 2018-03-21 05:00:00           B     6      7
16 2018-03-21 05:45:00           B     6      7
17 2018-03-22 12:01:44           B     4      8
你可以使用我在下面粘贴的东西来获得relid,但它可能要慢得多(而且更难理解)

步骤2:获取每个站点的单个A和B的时间。如果我们没有在difftime中指定单位,它将对单个单位进行计算,并显示一个公共单位。例如,如果有人在那里呆了几天,1.5小时变为1.5天

data %>%
  arrange(Individuals, Dates) %>%
  mutate(rle_id = data.table::rleid(Sites)) %>%
  group_by(Individuals, rle_id, Sites) %>%
  summarise(time_spent = difftime(max(Dates), min(Dates), units = "days"))

# A tibble: 8 x 4
# Groups:   Individuals, rle_id [8]
  Individuals rle_id Sites time_spent       
  <fct>        <int> <dbl> <time>           
1 A                1    38 20.202303241 days
2 A                2    40  0.061342593 days
3 B                3     4  0.009027778 days
4 B                4     6  0.001516204 days
5 B                5     7  0.030300926 days
6 B                6     4  0.010416667 days
7 B                7     6  0.031250000 days
8 B                8     4  0.000000000 days
数据%>%
安排(个人、日期)%>%
mutate(rle_id=data.table::rleid(Sites))%>%
分组依据(个人、rle id、站点)%>%
总结(花费的时间=差异时间(最大(日期)、最小(日期)、单位=“天”))
#一个tibble:8x4
#组:个人,rle_id[8]
个人rle_id站点花费的时间
1A 138 20.202303241天
2 A 240 0.061342593天
3 B 3 4 0.009027778天
4 B 4 0.001516204天
5 B 5 7 0.030300926天
6 B 6 4 0.010416667天
7 B 7 6 0.031250000天
8 B 8 40.000000000天
步骤3(完整解决方案)跨站点折叠

data %>%
  arrange(Individuals, Dates) %>%
  mutate(rle_id = data.table::rleid(Sites)) %>%
  group_by(Individuals, rle_id, Sites) %>%
  summarise(time_spent = difftime(max(Dates), min(Dates), units = "days")) %>%
  group_by(Individuals, Sites) %>%
  summarise(time_spent_new = sum(time_spent))

# A tibble: 5 x 3
# Groups:   Individuals [2]
  Individuals Sites time_spent_new  
  <fct>       <dbl> <time>          
1 A              38 20.20230324 days
2 A              40  0.06134259 days
3 B               4  0.01944444 days
4 B               6  0.03276620 days
5 B               7  0.03030093 days
数据%>%
安排(个人、日期)%>%
mutate(rle_id=data.table::rleid(Sites))%>%
分组依据(个人、rle id、站点)%>%
总结(花费的时间=差异时间(最大(日期)、最小(日期)、单位=“天”)%>%
按(个人、地点)分组%>%
总结(花费的时间=总计(花费的时间))
#一个tibble:5x3
#团体:个人[2]
个人网站花费在新网站上的时间
1 A 38 20.20230324天
2 A 40 0.06134259天
3 B 4 0.01944444天
4 B 6 0.03276620天
5 B 7 0.03030093天
数据

Date <-as.POSIXct(c("2018-04-09 16:43:44","2018-03-20 11:52:25", "2018-04-09 16:59:03",
                    "2018-04-09 18:27:23","2018-04-09 17:01:20", "2018-04-09 17:41:17",
                    '2018-03-20 11:52:25', '2018-03-22 12:01:44', '2018-03-20 12:05:25', 
                    '2018-03-20 12:10:40', '2018-03-20 12:12:51 ', '2018-03-21 2:01:23', 
                    '2018-03-21 2:45:01', '2018-03-21 3:30:00', '2018-03-21 3:45:00', 
                    '2018-03-21 5:00:00', '2018-03-21 5:45:00'))
Individual<-c(rep("A", 6), rep("B", 11))
Site<-c(38, 38, 40, 40, 40, 40, 4, 4, 4, 6, 6, 7, 7, 4, 4, 6, 6)

data<-data.frame(Dates = Date, Individuals = Individual, Sites = Site)

Date嗯,一个人和一个站点每天会有两个以上的条目吗?事实上,你能解释一下时间戳是什么吗?是到达/离开时间吗?好的,时间戳是一个人在站点X的位置的日期/时间。我每天有很多位置,有时每隔几分钟在站点上移动一次。这有帮助吗?当然有帮助,我刚刚发布了一个编辑。希望它能解决这个问题。如果没有,请告诉我!!此外,这些步骤只是将线添加到管道中,仅供参考。我只是认为这会有助于打破管道的运作。这很奇怪。您能否提供一个样本数据集来重现问题(只需添加一个编辑)?如果没有它,我将很难解决这个问题。此外,样本数据的当前输出是否与您期望的一样?看起来它正在做它所说的事情(例如,取
max
减去
min
),您不使用
18:27:23
?在示例数据上,尝试以下操作:
sort(data$Dates)
查看从最早到最新的日期。如果您确实想省略
18:27:23
,如果有明确的排除条件,我们可以找到一种方法!
Dates<-as.POSIXct(c("2018-04-09 16:43:44","2018-03-20 11:52:25", "2018-04-09 16:59:03",
                    "2018-04-09 18:27:23",
                    "2018-04-09 17:01:20",
                    "2018-04-09 17:41:17"))
Individual<-c("A","A","A","A", "A","A")
Site<-c("38","38", "40","40","40", "40")

data<-data.frame(Dates, Individual, Site)
                Dates Individual Site
1 2018-04-09 16:43:44          A   38
2 2018-03-20 11:52:25          A   38
3 2018-04-09 16:59:03          A   40
4 2018-04-09 18:27:23          A   40
5 2018-04-09 17:01:20          A   40
6 2018-04-09 17:41:17          A   40

data %>%
  group_by(Individual) %>%
  arrange(Dates) %>%
  group_by(Individual, Site) %>%   
  summarise(time_spent = max(Dates) - min(Dates))
# A tibble: 2 x 3
# Groups:   Individual [?]
  Individual Site  time_spent    
  <fct>      <fct> <time>        
1 A          38    20.202303 days
2 A          40     1.472222 days
maxtime<-("2018-04-09 18:27:23")
mintime<-("2018-04-09 16:59:03")

difftime(maxtime, mintime, units="hours")
# Time difference of 1.472222 hours  
    data %>%
      arrange(Individuals, Dates) %>%
      mutate(rle_id = data.table::rleid(Sites))

                 Dates Individuals Sites rle_id
1  2018-03-20 11:52:25           A    38      1
2  2018-04-09 16:43:44           A    38      1
3  2018-04-09 16:59:03           A    40      2
4  2018-04-09 17:01:20           A    40      2
5  2018-04-09 17:41:17           A    40      2
6  2018-04-09 18:27:23           A    40      2
7  2018-03-20 11:52:25           B     4      3
8  2018-03-20 12:05:25           B     4      3
9  2018-03-20 12:10:40           B     6      4
10 2018-03-20 12:12:51           B     6      4
11 2018-03-21 02:01:23           B     7      5
12 2018-03-21 02:45:01           B     7      5
13 2018-03-21 03:30:00           B     4      6
14 2018-03-21 03:45:00           B     4      6
15 2018-03-21 05:00:00           B     6      7
16 2018-03-21 05:45:00           B     6      7
17 2018-03-22 12:01:44           B     4      8
data <- data[order(data$Dates),]
rle_lengths <- rle(data$Sites)$lengths
unlist(Map(rep, 1:length(rle_lengths), rle_lengths))
[1] 1 2 2 3 3 4 4 5 5 6 6 7 8 9 9 9 9
data.table::rleid(data$Sites)
[1] 1 2 2 3 3 4 4 5 5 6 6 7 8 9 9 9 9
data %>%
  arrange(Individuals, Dates) %>%
  mutate(rle_id = data.table::rleid(Sites)) %>%
  group_by(Individuals, rle_id, Sites) %>%
  summarise(time_spent = difftime(max(Dates), min(Dates), units = "days"))

# A tibble: 8 x 4
# Groups:   Individuals, rle_id [8]
  Individuals rle_id Sites time_spent       
  <fct>        <int> <dbl> <time>           
1 A                1    38 20.202303241 days
2 A                2    40  0.061342593 days
3 B                3     4  0.009027778 days
4 B                4     6  0.001516204 days
5 B                5     7  0.030300926 days
6 B                6     4  0.010416667 days
7 B                7     6  0.031250000 days
8 B                8     4  0.000000000 days
data %>%
  arrange(Individuals, Dates) %>%
  mutate(rle_id = data.table::rleid(Sites)) %>%
  group_by(Individuals, rle_id, Sites) %>%
  summarise(time_spent = difftime(max(Dates), min(Dates), units = "days")) %>%
  group_by(Individuals, Sites) %>%
  summarise(time_spent_new = sum(time_spent))

# A tibble: 5 x 3
# Groups:   Individuals [2]
  Individuals Sites time_spent_new  
  <fct>       <dbl> <time>          
1 A              38 20.20230324 days
2 A              40  0.06134259 days
3 B               4  0.01944444 days
4 B               6  0.03276620 days
5 B               7  0.03030093 days
Date <-as.POSIXct(c("2018-04-09 16:43:44","2018-03-20 11:52:25", "2018-04-09 16:59:03",
                    "2018-04-09 18:27:23","2018-04-09 17:01:20", "2018-04-09 17:41:17",
                    '2018-03-20 11:52:25', '2018-03-22 12:01:44', '2018-03-20 12:05:25', 
                    '2018-03-20 12:10:40', '2018-03-20 12:12:51 ', '2018-03-21 2:01:23', 
                    '2018-03-21 2:45:01', '2018-03-21 3:30:00', '2018-03-21 3:45:00', 
                    '2018-03-21 5:00:00', '2018-03-21 5:45:00'))
Individual<-c(rep("A", 6), rep("B", 11))
Site<-c(38, 38, 40, 40, 40, 40, 4, 4, 4, 6, 6, 7, 7, 4, 4, 6, 6)

data<-data.frame(Dates = Date, Individuals = Individual, Sites = Site)