r - 计算距离矩阵并放置在分组数据框的单元格内
问题描述
所以,基本上我有一个包含很多“位置集”的数据框,我想为每组项目计算一个距离矩阵。我可以使用 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 个单元格中,但我什至不确定这是否可行?如果没有,包含每个试验的距离矩阵的列表也可以工作。
谢谢你的帮助!
解决方案
您可以在df by triallapply
之后使用允许计算每次试验的距离。split
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
推荐阅读
- android - 无法解决:firebase-database-15.0.0。我修复了这个错误并得到另一个
- redis - 如果命令之一不起作用,REDIS-管道不会失败
- python - 为什么我的代码会抛出“NameError: name 'ModuleNotFoundError' is not defined”错误?
- dll - 除非 libfreetype-6.dll 在 proj 文件夹中,否则 SDL2_ttf 找不到入口点
- scala - 为什么 sbt 找不到 KafkaUtils?
- sql - 如何查询 JSONB 字段字典中的值数组?
- python - 某些行会产生语法错误
- java - 如何访问cache2k的内部状态
- email - 如何使用 Plesk 修复无法在 VPS 中运行的网络邮件
- keras - Keras 中的 Evaluate 和 Predict 函数没有给出相同的统计数据