计算距离矩阵并放置在分组数据框的单元格中

Calculating a distance matrix and placing within a cell of a grouped data frame

所以,基本上我有一个包含很多 'sets of positions' 项目的数据框,我想为每组项目计算一个距离矩阵。我可以使用 for 循环并添加到列表中来完成此操作,但我认为必须有使用 dplyr、purrr 或类似方法的更优雅的方法,但我对如何进行完全空白。

所以让我们假设我的数据框是这样的:

df <- data.frame(
    trial = c(rep(1,3),rep(2,5),rep(3,7)),
    object_name = c("stapler", "bottle", "cup", "ball", "chocolate","tape","pen","bowl","stapler", "bottle", "cup", "ball", "tape","pen","bowl"),
    posX = c(0.1,0.2,0.3,0.3,0.2,0.5,-0.4,-0.1,0.8,-0.3,-0.4,0.3,0.2,0,-0.2),
    posY = c(-0.2,0.5,0.3,0.9,-0.3,-0.1,0,0.6,-0.7,-1,0.2,0.3,-0.8,0.6,1)
)

即对象名称可能会因试验而重叠,但每次试验的对象数量不同,我的目标是为每次试验使用 posX 和 posY 计算(欧几里得)距离矩阵。对于每个试验,这些矩阵的大小 不同 ,范围从 3x3 到 7x7。理想情况下,我能够将所有这些矩阵存储在数据框的 1 个单元格中,但我什至不确定这是否可能?如果没有,包含每个试验的距离矩阵的列表也可以。

感谢您的帮助!

你可以在 split df 之后使用 lapply 通过 trial what allows to calculate the distances per 试用.

lapply(split(df, df$trial), function(x) dist(cbind(x$posX,x$posY)))
#lapply(split(df, df$trial), function(x) dist(cbind(x$posX,x$posY), diag = TRUE, upper = TRUE)) #For a matrix
#$`1`
#          1         2
#2 0.7071068          
#3 0.5385165 0.2236068
#
#$`2`
#          1         2         3         4
#2 1.2041595                              
#3 1.0198039 0.3605551                    
#4 1.1401754 0.6708204 0.9055385          
#5 0.5000000 0.9486833 0.9219544 0.6708204
#
#$`3`
#          1         2         3         4         5         6
#2 1.1401754                                                  
#3 1.5000000 1.2041595                                        
#4 1.1180340 1.4317821 0.7071068                              
#5 0.6082763 0.5385165 1.1661904 1.1045361                    
#6 1.5264338 1.6278821 0.5656854 0.4242641 1.4142136          
#7 1.9723083 2.0024984 0.8246211 0.8602325 1.8439089 0.4472136