我有一个相机陷阱数据集,其中包含文件名,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称为上方管道中的一列。任何帮助将不胜感激!
答案 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