我正在尝试计算实验开始与实验期间每次测量温度之间的累积时间。我的实验有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上做,但必须打赌更好的解决方案!
答案 0 :(得分:1)
这是一种方式。首先,联合Date
和Time
列。然后,通过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