计算每个样品的总实验时间

时间:2017-12-05 00:43:07

标签: r datetime for-loop time difference

我正在尝试计算实验开始与实验期间每次测量温度之间的累积时间。我的实验有50多个样本(即A1,A2,B1,B2等),每个样本在不同的时间/天开始。

我想将时间视为连续变量,因此我需要计算每个温度测量的总计(以小时为单位的累计时间),如总时间变量(下图)所示。

有没有办法在不告诉R每个样本的开始和结束时间的情况下这样做?如何获得每次温度测量的累计时间?

数据外观如下所示:

Date    Time    Sample  Temp    **Total Time**
2017-06-28  13:58   A1  13.67870139 0
2017-06-29  16:08   A1  13.34256319 (time between 06-28 13:58 and 06-29 16:08)
2017-06-30  07:32   A1  12.84005139 (time between 06-28 13:58 and 06-30 07:32)
2017-06-30  19:14   A1  12.84005139 ect
2017-07-01  07:40   A1  11.83983472 
2017-07-01  19:20   A1  11.83983472 
2017-07-02  07:53   A1  11.75332292 
2017-07-02  19:06   A1  11.75332292 
2017-07-03  07:45   A1  11.74469167 
2017-07-03  19:04   A1  11.74469167 
2017-07-04  08:15   A1  11.45409583 

谢谢!

PS-我没有尝试过任何事情,因为我只能找到一个例子,其中有一个"开始时间"和#34;结束时间"山坳。我想我可以为每个样本创建一个开始时间col,并要求r计算开始时间和每次测量时间之间的时间差。我不知道如何让R为一个开始时间col每个样本的最早测量。我可以花一整天的时间在excel上做,但必须打赌更好的解决方案!

2 个答案:

答案 0 :(得分:1)

这是一种方式。首先,联合DateTime列。然后,通过lubridate::ymd_hm将其转换为时间戳。接下来,选择第一个时间戳。最后,创建两个新列,显示与开始日期的差异。

library(tidyverse)
library(lubridate)

df <- df %>%
  unite("datetime", c("Date", "Time"), sep = " ") %>%
  mutate(datetime = ymd_hm(datetime))

start_date <- df$datetime[1]

df %>%
  mutate(time_from_start_secs = datetime - start_date,
         time_from_start_period = seconds_to_period(time_from_start_secs))

#               datetime Sample     Temp time_from_start_secs time_from_start_period
# 1  2017-06-28 13:58:00     A1 13.67870               0 secs                     0S
# 2  2017-06-29 16:08:00     A1 13.34256           94200 secs           1d 2H 10M 0S
# 3  2017-06-30 07:32:00     A1 12.84005          149640 secs          1d 17H 34M 0S
# 4  2017-06-30 19:14:00     A1 12.84005          191760 secs           2d 5H 16M 0S
# 5  2017-07-01 07:40:00     A1 11.83983          236520 secs          2d 17H 42M 0S
# 6  2017-07-01 19:20:00     A1 11.83983          278520 secs           3d 5H 22M 0S
# 7  2017-07-02 07:53:00     A1 11.75332          323700 secs          3d 17H 55M 0S
# 8  2017-07-02 19:06:00     A1 11.75332          364080 secs            4d 5H 8M 0S
# 9  2017-07-03 07:45:00     A1 11.74469          409620 secs          4d 17H 47M 0S
# 10 2017-07-03 19:04:00     A1 11.74469          450360 secs            5d 5H 6M 0S
# 11 2017-07-04 08:15:00     A1 11.45410          497820 secs          5d 18H 17M 0S

或者,您可以使用min(datetime)。此外,如果您需要进行计算&#34;重置&#34;对于每个sample,您将需要使用group_by - 我们将拥有所有这一切:

df %>%
  unite("datetime", c("Date", "Time"), sep = " ") %>%
  group_by(Sample) %>%
  mutate(datetime = ymd_hm(datetime),
         time_secs = datetime - min(start_date))

答案 1 :(得分:0)

这似乎是一个相当简单的数据操作任务。你基本上尝试的是一个简单的组和时差。

下面的代码片段可以实现::

步骤1:将日期和时间添加到同一变量,以便我们可以计算差异

步骤2:计算该组的当前时间与最短时间之间的差异

我将您的数据更新为两组;只是为了展示一个例子。

library(dplyr) # pipes, group by and mutate
library(lubridate) # times 

input_data <- read.table(text = "Date    Time    Sample  Temp
                         2017-06-28  13:58   A1  13.67870139
                         2017-06-29  16:08   A1  13.34256319
                         2017-06-30  07:32   A1  12.84005139
                         2017-06-30  19:14   A1  12.84005139
                         2017-07-01  07:40   A1  11.83983472 
                         2017-07-01  19:20   A1  11.83983472 
                         2017-07-02  07:53   A1  11.75332292 
                         2017-07-02  19:06   A2  11.75332292 
                         2017-07-03  07:45   A2  11.74469167 
                         2017-07-03  19:04   A2  11.74469167 
                         2017-07-04  08:15   A2  11.45409583", 
                         header = TRUE, stringsAsFactors = FALSE) %>%
  mutate(Actual_Time = paste(Date, Time, sep =" ") %>% parse_date_time(., "%y-%m-%d %H:%M")) %>%
  group_by(Sample) %>%
  mutate(Total_Time = difftime(Actual_Time, min(Actual_Time), units = "hours"))

输出

# A tibble: 11 x 6
# Groups:   Sample [2]
Date           Time  Sample   Temp       Actual_Time       Total_Time
<chr>         <chr>  <chr>    <dbl>         <dttm>            <time>
 1 2017-06-28 13:58     A1 13.67870 2017-06-28 13:58:00  0.00000 hours
 2 2017-06-29 16:08     A1 13.34256 2017-06-29 16:08:00 26.16667 hours
 3 2017-06-30 07:32     A1 12.84005 2017-06-30 07:32:00 41.56667 hours
 4 2017-06-30 19:14     A1 12.84005 2017-06-30 19:14:00 53.26667 hours
 5 2017-07-01 07:40     A1 11.83983 2017-07-01 07:40:00 65.70000 hours
 6 2017-07-01 19:20     A1 11.83983 2017-07-01 19:20:00 77.36667 hours
 7 2017-07-02 07:53     A1 11.75332 2017-07-02 07:53:00 89.91667 hours
 8 2017-07-02 19:06     A2 11.75332 2017-07-02 19:06:00  0.00000 hours
 9 2017-07-03 07:45     A2 11.74469 2017-07-03 07:45:00 12.65000 hours
10 2017-07-03 19:04     A2 11.74469 2017-07-03 19:04:00 23.96667 hours
11 2017-07-04 08:15     A2 11.45410 2017-07-04 08:15:00 37.15000 hours