Есть ли способ агрегирования по нескольким группам в R? - PullRequest
0 голосов
/ 12 января 2019

У меня есть набор данных камеры с именами файлов, SiteID, видами, количеством, датой, временем и т. Д. Я пытаюсь создать таблицу записей, в которой у меня есть МАКСИМАЛЬНОЕ количество независимых обнаружений для каждого обнаруженного вида, для каждой камеры (то есть, если независимый интервал был установлен на 30 минут, и было обнаружение 2 оленей и обнаружение 13 оленей в пределах того же 30-минутного интервала, я хочу, чтобы 13 использовалось вместо 2).

Исходные данные:

File     SiteID     Date            Time       Species     Count
Can_001  YVR01      03-May-2018     21:34:25   Squirrel    3
Can_001  YVR01      03-May-2018     21:34:58   Squirrel    3
Can_001  YVR01      03-May-2018     21:36:25   Squirrel    1

Что я сделал до сих пор, так это попытался сначала сгруппировать по siteID, затем по видам, затем по дате, а затем создать столбец с 30-минутными временными интервалами, из которых мне нужно затем выяснить, как получите максимальное значение 'Count' за интервал времени - это будут обнаружения, которые я использую.

species_group <- group_by(y4, SiteID) %>% group_by(Species) %>% group_by(Date) %>% group_by(Interval_Time=floor_date(DateTimeOriginalp, "30 minutes"))

Мне удалось добраться до этапа, на котором был создан период 30-минутного интервала и был создан столбец, но после этого момента ни одна из функций summaze (), aggregate (), tapply () и т. Д. Не работает, поскольку она выиграла ' Я не могу открыть созданный столбец "Interval_Time". Новый столбец Interval_Time имеет формат dttm и отображается, когда я просматриваю и вызываю фрейм видовpec_group. То, что мне нужно сделать сейчас, это получить максимальное количество каждого вида в этих интервалах. Вот что я попробовал (то есть вне трубы):

speciesgroup3 <- aggregate(species_group$Count, by=list(species_group$Interval_Time), max)

Который возвратил фрейм данных только из двух столбцов, максимального количества и Interval_Time ... который не полезен, так как мне нужны эти данные, разделенные сначала по участку, а затем по видам.

Что касается меня, я не могу понять, почему я не могу вызвать Interval_Time в качестве столбца в трубе выше. Любая помощь будет принята с благодарностью!

Ответы [ 2 ]

0 голосов
/ 12 января 2019

Это должно быть близко к тому, что вы ищете, используя функции dplyr, включенные в библиотеку tidyverse

library(tidyverse)
library(lubridate)
df = read.table(text="
File     SiteID     Date            Time       Species     Count
Can_001  YVR01      03-May-2018     21:34:25   Squirrel    3
Can_001  YVR01      03-May-2018     21:34:58   Squirrel    3
Can_001  YVR01      03-May-2018     22:01:25   Squirrel    1
Can_001  YVR01      03-May-2018     21:34:58   Deer        5
Can_001  YVR01      03-May-2018     21:36:25   Deer        7
", header=T)

# Use mutate and the lubridate::mdy_hms to derive a proper date
# column from the text date time 
df2 <- df %>%
  mutate(DateTime = mdy_hms(paste(Date, Time)),
         period = floor_date(DateTime, "30 mins")) %>%
         select(-Date, -Time)

# File SiteID  Species Count            DateTime              period
# 1 Can_001  YVR01 Squirrel     3 2018-03-20 21:34:25 2018-03-20 21:30:00
# 2 Can_001  YVR01 Squirrel     3 2018-03-20 21:34:58 2018-03-20 21:30:00
# 3 Can_001  YVR01 Squirrel     1 2018-03-20 22:01:25 2018-03-20 22:00:00
# 4 Can_001  YVR01     Deer     5 2018-03-20 21:34:58 2018-03-20 21:30:00
# 5 Can_001  YVR01     Deer     7 2018-03-20 21:36:25 2018-03-20 21:30:00

# Summarize dow to the period level, applying the max function within the group by
df2 %>% 
  group_by(SiteID, Species, period) %>%
  summarize(n = max(Count))

# Groups:   SiteID, Species [?]
# SiteID Species  period                  n
# <fct>  <fct>    <dttm>              <dbl>
# 1 YVR01  Deer     2018-03-20 21:30:00     7
# 2 YVR01  Squirrel 2018-03-20 21:30:00     3
# 3 YVR01  Squirrel 2018-03-20 22:00:00     1
0 голосов
/ 12 января 2019

Может быть, вы могли бы использовать:

aggregate(. ~Interval_Time+SiteID, data=species_group, max, na.rm=TRUE)

Посмотрите, например, здесь на похожую проблему https://stats.stackexchange.com/questions/169056/aggregate-all-data-by-date-and-id

...