2017-09-13 85 views
0

我試圖測量幾個啓動和停止點之間的時間差,但也取每個Var1列的平均值/ SD開始/停止期間。這些表可以很長,但是這是一個示例:如何測量啓動和停止之間的時間延遲,並計算它們之間的平均值/ sd

Status Time (s) Var1  Var2 
Start 0.05715238 0.7421875 -23.34501 
Cont 0.08572857 0.7226562 -34.24408 
Stop 0.11430476 0.703125 -34.24408 
Start 0.25718571 1.3867188 -28.01136 
Cont 0.2857619 1.3867188 -28.01136 
Stop 0.3143381 1.3867188 -42.92692 

我可以通過以啓動子集劃分的數據框獲得的持續時間和停止變量,並從一開始就減去結束時間。但是,這將刪除「連續」,或繼續爲變量1和2的數據。

有沒有人有關於如何解決R中的這個問題的任何建議?爲了在每個啓動和停止期間生成平均值/標準差?

我希望我的結果看起來像這樣(P =啓動/停止期):

p1_mean_var1 p1_sd_var1 pe1_mean_var2 p1_sd_var2 p2_mean_var1 p2_sd_var1 p2_mean_var2 p2_sd_var2 
0.7226562333 0.01953125 -30.61105667 6.29258094 1.3867188  0   -32.9832133  8.61150258 

我有很多這些類型的表,我想總結一下他們每個人在一行。

任何幫助,將不勝感激!我甚至不知道從哪裏開始。

-etg

回答

1

最好先將數據轉化爲更簡單的形式。你正在設想行按照週期排序。將其保存在data.frame中。

measures <- read.table(header = TRUE, text = " 
Status Time  Var1  Var2 
Start 0.05715238 0.7421875 -23.34501 
Cont 0.08572857 0.7226562 -34.24408 
Stop 0.11430476 0.703125 -34.24408 
Start 0.25718571 1.3867188 -28.01136 
Cont 0.2857619 1.3867188 -28.01136 
Stop 0.3143381 1.3867188 -42.92692 
") 

library(dplyr) 
library(tidyr) 

start_indices <- which(measures[["Status"]] == 'Start') 

measures <- measures %>% 
    mutate(Period = findInterval(
    seq_along(Status), 
    start_indices 
)) 

measures 
# Status  Time  Var1  Var2 Period 
# 1 Start 0.05715238 0.7421875 -23.34501  1 
# 2 Cont 0.08572857 0.7226562 -34.24408  1 
# 3 Stop 0.11430476 0.7031250 -34.24408  1 
# 4 Start 0.25718571 1.3867188 -28.01136  2 
# 5 Cont 0.28576190 1.3867188 -28.01136  2 
# 6 Stop 0.31433810 1.3867188 -42.92692  2 

因爲你想要做同樣的事情Var1Var2,很容易給他們單獨行和一次處理他們兩個。這可以很容易地擴展到任何數量的變量。

period_stats <- measures %>% 
    gather(key = "Variable", value = "Value", Var1, Var2) %>% 
    group_by(Period, Variable) %>% 
    summarise(
    Mean  = mean(Value), 
    StandDev = sd(Value), 
    Duration = max(Time) - min(Time) 
) 

period_stats 
# A tibble: 4 x 5 
# Groups: Period [?] 
# Period Variable  Mean StandDev Duration 
# <int> <chr>  <dbl>  <dbl>  <dbl> 
# 1  1  Var1 0.7226562 0.01953125 0.05715238 
# 2  1  Var2 -30.6110567 6.29258100 0.05715238 
# 3  2  Var1 1.3867188 0.00000000 0.05715239 
# 4  2  Var2 -32.9832133 8.61150258 0.05715239 
+0

謝謝!我一直在玩dplyr的功能,但在tidyr上錯過了!發揮魅力。 – etgriffiths