2017-12-05 32 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を最も早い時間に開始時間colにする方法を知らない各サンプルの測定。私は一日中エクセルでそれをやることができますが、より良い解決策を賭ける必要があります!

+0

は、あなたがしようとしているものを私たちに示すことができました。ここでは、このサイトのための良いスタートリソースhttps://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example –

+1

* "Rに開始時間と終了時間を知らせない" *。 ..あなたの例では、 'Date'と' Time'変数で終了時刻を知り、 'lag(Date)'(...)に基づいて開始時刻を推測します。 'lag()'が安全でない場合、答えはほぼ確実です。 "いいえ、Rはサンプルが何回開始されたか知ることができません" :-)それが安全であれば(私の疑惑)、 'Date'と' Time'の2つのフィールドを単一の 'POSIXt'フィールドに変換することをお勧めします。、 'DateTime')、' x < - c(0、diff(DateTime)) 'と' units(a)< - "hours" 'を使用します。 – r2evans

+0

しかし、私は手動で各50サンプルの開始時間を入力する必要がありますか?私 –

答えて

1

ここには1つの方法があります。まず、DateTimeの列を結合します。その後、lubridate::ymd_hmを介してタイムスタンプに変換します。次に、最初のタイムスタンプを取り出します。最後に、開始日との差分を示す2つの新しい列を作成します。

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を計算することができるように同じ変数に日付と時刻を追加します。そのグループのために

データを更新して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 
関連する問題