2017-12-05 16 views
0

실험 도중 만든 온도 측정과 실험 시작 사이의 누적 시간을 계산하려고합니다. 실험에 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- "시작 시간"과 "종료 시간"이있는 예제 만 찾을 수 있기 때문에 아무 것도 시도하지 않았습니다. 나는 각 샘플에 대한 시작 시간 col을 만들 수 있다고 생각하고 시작 시간과 각 측정 시간 사이의 시간차를 계산하도록 r에 요청합니다. R이 초기 시간 열을 가장 먼저 만드는 방법을 알지 못합니다. 각 샘플에 대한 측정. 나는 그것을 하루 종일 Excel에서 수행 할 수 있지만 더 나은 솔루션을 내기해야합니다!

+0

당신은 당신이 시도 것을 우리에게 보여 없습니다. 이 사이트에 대한 좋은 시작 리소스는 https://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example –

+1

* "시작 및 종료 시간을 알리지 않고"*입니다. ..하지만 당신의 예제에서는'Date'와'Time' 변수로 종료 시간을 알 수 있고'lag (Date)'(...)에 기초하여 시작 시간을 추측 할 수 있습니다. 'lag()'이 안전하지 않다면, 그 대답은 거의 확실합니다. "아니오, R은 샘플이 시작된 시간을 알 수 없습니다.":-). 안전하다면 (의심),'Date'와'Time' 두개의 필드를 하나의'POSIXt' 필드 (예.,'DateTime'),'x <- c (0, diff (DateTime))'그리고 결국'units (a) <- "hours"'를 사용하십시오. – r2evans

+0

그렇다면 수동으로 각 50 개 샘플의 시작 시간을 입력해야합니까? 나는 –

답변

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)을 사용할 수 있습니다. 당신이 계산을해야하는 경우 또한, 각 sample로 "다시"당신은 group_by 사용하기를 원할 것입니다 - 우리가 가진 것이 하나의 큰 급습 모든 :

df %>% 
    unite("datetime", c("Date", "Time"), sep = " ") %>% 
    group_by(Sample) %>% 
    mutate(datetime = ymd_hm(datetime), 
     time_secs = datetime - min(start_date)) 
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