функция emd2d от падений emdist
Я пытаюсь применить функцию к списку с помощью apply, но у меня возникли проблемы с этим. Я пытаюсь вычислить расстояние между землеройными двигателями с помощью пакета emdist. Каждый индекс в списке имеет два подиндекса. Я хочу вычислить расстояние землеройных машин для этих подиндексов итеративно (реальный список имеет тысячи индексов). Проблема в том, что Rstudio аварийно завершает работу каждый раз, когда я пытаюсь запустить код на тестовом наборе данных. Пример тестового набора данных:
set.seed(42)
output1 <- list(list(matrix(0,8,11),matrix(0,8,11)), list(matrix(rnorm(80),8,10),matrix(rnorm(80),8,10)))
[[1]]
[[1]][[1]]
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11]
[1,] 0 0 0 0 0 0 0 0 0 0 0
[2,] 0 0 0 0 0 0 0 0 0 0 0
[3,] 0 0 0 0 0 0 0 0 0 0 0
[4,] 0 0 0 0 0 0 0 0 0 0 0
[5,] 0 0 0 0 0 0 0 0 0 0 0
[6,] 0 0 0 0 0 0 0 0 0 0 0
[7,] 0 0 0 0 0 0 0 0 0 0 0
[8,] 0 0 0 0 0 0 0 0 0 0 0
[[1]][[2]]
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11]
[1,] 0 0 0 0 0 0 0 0 0 0 0
[2,] 0 0 0 0 0 0 0 0 0 0 0
[3,] 0 0 0 0 0 0 0 0 0 0 0
[4,] 0 0 0 0 0 0 0 0 0 0 0
[5,] 0 0 0 0 0 0 0 0 0 0 0
[6,] 0 0 0 0 0 0 0 0 0 0 0
[7,] 0 0 0 0 0 0 0 0 0 0 0
[8,] 0 0 0 0 0 0 0 0 0 0 0
Теперь, когда я делаю это:
library(emdist)
sapply(output1,function(x) {emd2d(x[[seq_along(x)[1]]],x[[seq_along(x)[2]]]) })
Rstudio просто вылетает. Я также попытался:
mapply(emd2d,sapply(output1,`[`,1),sapply(output1,`[`,2))
Но безрезультатно. Есть идеи? Я запускаю это на macbook air 2013 года с 2 ГБ оперативной памяти.1 ответ:
Это прекрасно работает:
> emd2d(output1[[2]][[1]],output1[[2]][[2]]) [1] -6.089909
Это не означает:
emd2d(output1[[1]][[1]],output1[[1]][[2]])
Кажется, что
emd2d()
может ненавидеть, когда вы сравниваете две все нулевые матрицы...По крайней мере, для меня на OSX, как это удается для меня:
set.seed(666) output2 <- list(list(matrix(5,8,11),matrix(5,8,11)), list(matrix(rnorm(80),8,10),matrix(rnorm(80),8,10))) sapply(output2,function(x) {emd2d(x[[1]],x[[2]]) }) #[1] 0.000000 -7.995288 # not i removed your seq_along because I don't think you really want this..
Как и это:
> set.seed(666) > output2 <- list(list(matrix(0,8,11),matrix(5,8,11)), list(matrix(rnorm(80),8,10),matrix(rnorm(80),8,10))) > sapply(output2,function(x) {emd2d(x[[1]],x[[2]]) }) [1] NaN -7.995288
Может быть, вам нужно связаться с создателем пакета по этому поводу, а тем временем вы могли бы создать функцию, которая проверяет, все ли матрицы равны нулю, например
foo <- function(z){ if( sum(length(z[[1]][ z[[1]] != 0]), length(z[[2]][ z[[2]] != 0]) ) > 0){ emd2d(z[[1]],z[[2]]) }else{ 0 } } # i use length and subsetting, not just sum(), in case somehow # the two matrices sum to zero because you have minus values in them > sapply(output1, foo) [1] 0.000000 -6.089909