计算距离矩阵并放置在分组数据框的单元格中
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
所以,基本上我有一个包含很多 '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