【问题标题】:Calculating a distance matrix and placing within a cell of a grouped data frame计算距离矩阵并放置在分组数据框的单元格内
【发布时间】:2020-06-18 12:19:52
【问题描述】:

所以,基本上我有一个包含大量“位置集”项目的数据框,我想为每组项目计算一个距离矩阵。我可以使用 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 个单元格中,但我什至不确定这是否可能?如果没有,包含每个试验的距离矩阵的列表也可以。

感谢您的帮助!

【问题讨论】:

    标签: r dataframe distance-matrix


    【解决方案1】:

    您可以在split 之后使用lapply df by trial 允许计算每次trial 的距离。

    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
    

    【讨论】:

    • 谢谢。我还为未来的人找到了一个 dplyr 解决方案:data %&gt;% group_by(SubID, block, cluster, trial,phase) %&gt;% select(posX, posZ,name.of.object) %&gt;% nest() %&gt;% mutate(dist_matrix = map(data,dist))
    猜你喜欢
    • 2018-08-05
    • 1970-01-01
    • 1970-01-01
    • 2012-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多