Вычисление матрицы расстояний и размещение в ячейке сгруппированного фрейма данных - PullRequest
0 голосов
/ 18 июня 2020

Итак, в основном у меня есть фрейм данных с множеством «наборов позиций» элементов, и я хочу рассчитать матрицу расстояний для каждого набора элементов. Я мог бы сделать это, используя for l oop и добавив его в список, но я думаю, что должен быть более элегантный метод, использующий 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 Ответ

2 голосов
/ 18 июня 2020

Вы можете использовать lapply после split df по испытанию , что позволяет рассчитать расстояния на испытание .

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
...