是否可以通过R中的多个组进行汇总?

时间:2019-01-11 22:01:56

标签: r group-by aggregate

我有一个相机陷阱数据集,其中包含文件名,SiteID,物种,计数,日期,时间等。我想要做的是创建一个记录表,其中对于每个检测到的物种,我拥有独立检测的最大数量,对于每个照相台(即,如果将独立间隔设置为30分钟,并且在同一30分钟间隔内检测到2头鹿,并且检测到13头鹿,我希望使用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分钟时间间隔的列,从中我需要弄清楚如何在时间间隔内获取最大的“计数”值-这些将是我正在使用的检测方法。

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

我能够进入创建30分钟间隔周期并创建列的阶段,但是在此之后,summarise(),aggregate(),tapply()等函数似乎都无法正常工作,因为它将成功。请允许我调出创建的“ Interval_Time”列。新的Interval_Time列为dttm格式,并在我查看和调用species_group数据框时显示。我现在需要做的是获取这些间隔内每个物种的最大数量。这是我尝试过的方法(即,在管道外部):

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

哪个返回的数据帧只有两列,即最大计数和Interval_Time ...,这没什么用,因为我需要先按地点然后按物种分开的数据。

在我生命中,我无法弄清楚为什么我不能将Interval_Time称为上方管道中的一列。任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:1)

使用tidyverse库中包含的dplyr函数,它应该与您要查找的内容接近

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

答案 1 :(得分:0)

也许您可以使用:

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

例如在这里查找类似问题 https://stats.stackexchange.com/questions/169056/aggregate-all-data-by-date-and-id