Рассчитать разницу между значениями по группам и сопоставить по времени - PullRequest
0 голосов
/ 02 мая 2018

Для каждой отдельной птицы я хотел бы рассчитать разницу между измерениями средней почасовой температуры тела (Tb), проведенными в разные дни (Tb_Periods). Моя цель - сравнить изменения в Tb для BirdX с 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

Что я сделал до сих пор: Каждой птице измеряют температуру тела каждые 10 минут в течение 48 часов, поэтому я сначала вычислил среднее значение Tb каждой птицы для каждого часа, используя dplyr:

    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))))

но продолжает получать NA для столбца Tb_Diff. Каков наилучший подход к решению этой проблемы (в идеале, с использованием dplyr)?

1 Ответ

0 голосов
/ 02 мая 2018

Ты почти у цели! Ключом является преобразование Tb_Period в упорядоченный коэффициент, так что PreI рассматривается как «меньше» 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...