簡體   English   中英

按組和時間匹配計算值之間的差異

[英]Calculate difference between values by group and matched for time

對於每只鳥,我想計算不同日期的平均每小時體溫(Tb)測量值之間的差異(Tb_Periods)。 我的目標是能夠比較BirdX的Tb從0900 PreI到09:00 DayI,10:00 PreI到10:00 PostI等的變化。Tb_Period表示操作(PreI),操作日之前的時間(DayI)和后期操作(PostI)。 我最初的df:

    Date_Time           Bird_ID  Tb   Hour  Treatment  Tb_Period
    2018-04-04 11:01:39   3282   42.2  11    Control     PreI
    2018-04-04 12:31:51   3282   41.2  12    Control     PreI
    ....
    2018-04-05 09:16:54   3282   41.9   9    Control     DayI
    ....
    2018-04-06 08:09:57   3282   41.4   8    Control     PostI

到目前為止,我已經完成的工作:每只鳥在48小時的時間內每10分鍾進行一次體溫測量,因此我首先使用dplyr計算了每只鳥每小時的平均Tb:

    Tb_Averages <- TbData %>% group_by(Tb_Period, Hour, Bird_ID, Treatment)%>% 
                          summarize(meanHourTb = mean(Tb))

產生的df:

         Tb_Period  Hour  Bird_ID  Treatment  meanHourTb
         PreI        9      3500       LPS    41.55000
         PreI        10     3500       LPS    41.75000       
         ...
         DayI        9      3500       LPS    40.88182
         DayI        10     3500       LPS    41.24000

現在我想要的是一個如下所示的df:

         Bird_ID  Hour  Treatment  Tb_Diff 
          3500     9      LPS        -.67 (40.88-41.55)
          3282     9      LPS         .5 (e.g.)

基於“ 按組計算連續行中的值之間的差異”的答案,我嘗試了以下變化(使用dplyrs排列功能):

           Tb_Averages <- Tb_Averages %>%
           group_by(Tb_Period, Bird_ID, Hour) %>%
           mutate(Tb_Diff = c(NA, diff(meanHourTb))))

但一直在獲取Tb_Diff列的NA。 解決此問題的最佳方法是什么(最好使用dplyr)?

你快到了! 關鍵是將Tb_Period轉換為有序因子,這樣PreI被視為“小於” DayI ,而DayI則小於PostI 一旦確定了這一點,我們就可以按每只鳥和每小時進行分組,並按Tb_Period進行排序,以確保以正確的順序計算差異:

df <- read.table(text = 'Tb_Period  Hour  Bird_ID  Treatment  meanHourTb
PreI        9      3500       LPS    41.55000
PreI        10     3500       LPS    41.75000       
DayI        9      3500       LPS    40.88182
DayI        10     3500       LPS    41.24000', header = T, stringsAsFactors = F)

df <- df %>% 
  mutate(Tb_Period = factor(Tb_Period, c('PreI', 'DayI', 'PostI'), ordered = T)) %>% 
  group_by(Bird_ID, Hour) %>% 
  mutate(diff = meanHourTb - lag(meanHourTb, 1))

# A tibble: 4 x 6
# Groups:   Bird_ID, Hour [2]
  Tb_Period  Hour Bird_ID Treatment meanHourTb     diff
      <ord> <int>   <int>     <chr>      <dbl>    <dbl>
1      PreI     9    3500       LPS   41.55000       NA
2      PreI    10    3500       LPS   41.75000       NA
3      DayI     9    3500       LPS   40.88182 -0.66818
4      DayI    10    3500       LPS   41.24000 -0.51000

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM