【发布时间】:2020-06-12 07:58:38
【问题描述】:
我使用一组自动、时间同步和固定的探测器麦克风对蝙蝠的超声波呼叫活动进行了采样。在生成的数据帧中,每一行都是一个录制的通话,以及录制时间、通话的长度(活动的代理)以及设备的 x 和 y 坐标。
我想将探测器距离与 delta(每两个探测器之间的呼叫长度差异)关联起来,以评估空间距离对探测器性能的影响。为此,我需要将每个数据帧行与所有其他数据帧行成对组合,并且每个时间戳(= 组),最后应用两个函数计算(i)增量和(ii)每对检测器之间的空间距离。这是一个示例数据帧,由三个设备和三个时间戳组成。
bats <- data.frame(time=as.POSIXct(rep(c("2019-05-18 00:00:00","2019-05-18 00:05:00","2019-05-18 00:10:00"),each=3)), device=rep(c("a","b","c"),3), pos.X=rep(c(0,2,4),3), pos.Y=rep(c(5,7,9),3), call.length=rlnorm(9,meanlog=0.5,sd=1))
对于一组,我成功地使用了 combn() 和 raster::pointDistance():
delta <- abs(combn(x=bats$call.length, m=2, FUN=function(x) x[1]-x[2])) # calculate delta
coordinates <- bats[ ,3:4] # make dataframe of coordinates
row.pairs <- combn(x=nrow(bats), m=2) # get indices for row pairs
df_row.pairs <- cbind(x=coordinates[row.pairs[1,],], y=coordinates[row.pairs[2,],]) # make dataframe from the row pairs
distance <- raster::pointDistance(p1=df_row.pairs[2:1], df_row.pairs[4:3], lonlat=FALSE) # calculate distances among coordinates
df <- data.frame(delta,distance=distance) # bind distances and deltas to a dataframe
但是尝试使用 dplyr::group_by(time) %>% group_map() 扩展所有时间戳的代码,我惨遭失败。
特别欢迎 Tidyverse 解决方案,但我非常感谢每一个建议。
【问题讨论】: