【发布时间】:2018-08-15 15:05:04
【问题描述】:
我有一个大型数据框,其中包含每个月放置在不同位置的相机陷阱的相机陷阱观察结果。一项观察由一只动物触发的五张照片组成。 Excerpt of the dataframe
前 20 行中的dput:
>structure(list(deploymentid = structure(c(2L, 2L, 2L, 2L, 2L,
>2L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L), .Label = c("B4-Wintergatter_Riedlhäng",
"I3-Wintergatter_Riedlhäng"), class = "factor"), species = structure(c(1L,
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L,
1L, 1L, 1L), .Label = "Rotwild", class = "factor"), time = structure(c(1520900972,
1520900972, 1520900972, 1520900972, 1520900972, 1520900982, 1520900982,
1520900982, 1520900982, 1520900982, 1520901025, 1520901025, 1520901025,
1520901025, 1520901025, 1520975705, 1520975705, 1520975705, 1520975705,
1520975705), class = c("POSIXct", "POSIXt"), tzone = "UTC")), .Names = c("deploymentid",
"species", "time"), row.names = c(NA, 20L), class = "data.frame")
为了分析,我已确定连续观察之间的 2 分钟时间段被认为是独立的。为了实现这一点,我计算了每个相机部署的两张连续照片之间的时间差。之后,我选择了差异大于两分钟的所有时间。然后我将数据框子集化为仅包含在这些选定时间拍摄的照片:
1) 首先,我使用 dplyr 计算到同一部署的上一张照片的时间间隔。对于每个部署的第一次观察,我随机选择 1000 作为大于 120 的数字,因此稍后将其包含在我的选择中。
library(dplyr)
deerobs_tbl<-tbl_df(Deerobs)
deerobs_gr<-group_by(deerobs_tbl,deploymentid)
deerobs_or<-arrange(deerobs_gr$time,.by_group = T)
deerobs_2<-mutate(deerobs_or,diff=c(1000,diff(time)))
deerobs2_df<-data.frame(deerobs_2)
2) 我想这也可以通过 dplyr 实现,但 plyr 更易于使用。我只构建了一个数据框,其中包含部署 ID、时间以及与上一张图片的时间差的列。然后,我为每个部署选择了相隔超过 2 分钟的时间,并选择了具有这些时间的所有行。
library (plyr)
deerobs_times<-data.frame(deerobs2_df$time,deerobs2_df$deploymentid,deerobs2_df$diff)
deerobs_times_apart<-ddply(deerobs_times,"deerobs2_df.deploymentid",subset,deerobs2_df.diff>120)
deerobs_t<-deerobs_times_apart[,1]
Deerobs_subset<-subset(deerobs2_df,deerobs2_df$time%in%deerobs_t)
唯一的问题是,这会删除比必要更多的观察结果。照片的数量从 9000 多张减少到 3000 多张。例如,如果 10 次观测以 1.5 分钟的间隔相互跟随,则所有照片都将被删除,尽管有 5 张彼此相距超过 2 分钟。有没有可能绕过这个问题,选择所有相隔两分钟以上的观察?
【问题讨论】:
-
您可以改用
dput发布您的数据吗?无法从图像中抓取数据。 -
我添加了一个指向包含数据的文件的链接,我希望它可以这样工作。
-
您是否刚刚在 filedropper 上发布了指向您的数据的链接?请改用
dput发布您的数据。请阅读How to make a great R reproducible example? 寻求帮助。如果您想得到答案,您需要帮助我们帮助您。 -
感谢您的帮助,希望这次我做对了。
-
这是我从帖子中了解到的:如果数据有 10 个相隔 1 分钟的观测值,并且您发现连续观测值之间的时间差(使用 diff 等),那么所有这些观测值都是丢弃。但是,如果您要依次丢弃观察结果并每次重新计算时间差,则第三个观察结果的时间差将大于 2 分钟(与第一个观察结果相比,第二个观察结果被丢弃)并将被保留。是这样吗?