簡體   English   中英

成對組合分組 R 數據幀的行並將函數應用於每一對

[英]Pairwise combine the rows of a grouped R dataframe and apply functions to each pair

我使用一組自動、時間同步和固定的探測器麥克風對蝙蝠的超聲波呼叫活動進行了采樣。 在生成的數據幀中,每一行都是記錄的呼叫,以及記錄時間、呼叫的長度(活動的代理)以及設備的 x 和 y 坐標。

我想將探測器距離與 delta(每兩個探測器之間的呼叫長度差異)相關聯,以評估空間距離對探測器性能的影響。 為此,我需要將每個數據幀行與所有其他行和每個時間戳(= 組)成對組合,最后應用兩個函數計算 (i) delta 和 (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 解決方案特別受歡迎,但我非常感謝每一個建議。

如果我正確理解了您的問題,您可以將數據幀與自身(每個時間戳)連接起來,然后計算增量和距離:

library(dplyr)
bats %>%
  left_join(bats, by = "time", suffix = c("", "_2")) %>%
  mutate(distance = sqrt((pos.X - pos.X_2) ^ 2 + (pos.Y - pos.Y_2) ^ 2),
         delta = abs(call.length - call.length_2)) 

結果:

# A tibble: 27 x 11
   time                device pos.X pos.Y call.length device_2 pos.X_2 pos.Y_2 call.length_2 distance delta
   <dttm>              <fct>  <dbl> <dbl>       <dbl> <fct>      <dbl>   <dbl>         <dbl>    <dbl> <dbl>
 1 2019-05-18 00:00:00 a          0     5       2.17  a              0       5         2.17      0     0   
 2 2019-05-18 00:00:00 a          0     5       2.17  b              2       7         0.361     2.83  1.81
 3 2019-05-18 00:00:00 a          0     5       2.17  c              4       9         3.49      5.66  1.32
 4 2019-05-18 00:00:00 b          2     7       0.361 a              0       5         2.17      2.83  1.81
 5 2019-05-18 00:00:00 b          2     7       0.361 b              2       7         0.361     0     0   
 6 2019-05-18 00:00:00 b          2     7       0.361 c              4       9         3.49      2.83  3.13
 7 2019-05-18 00:00:00 c          4     9       3.49  a              0       5         2.17      5.66  1.32
 8 2019-05-18 00:00:00 c          4     9       3.49  b              2       7         0.361     2.83  3.13
 9 2019-05-18 00:00:00 c          4     9       3.49  c              4       9         3.49      0     0   
10 2019-05-18 00:05:00 a          0     5       3.79  a              0       5         3.79      0     0   
# ... with 17 more rows

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM