ifelse внутри mapply () для замены координат в df - PullRequest
0 голосов
/ 12 июня 2019

Мне нужно написать строку кода, которая будет находить координаты за пределами границ и возвращать их обратно в границы. Я пытаюсь использовать mapply () с ifelse (), но продолжаю получать ошибки. Пример ниже.

У меня есть список пространственных точек (координаты x, y) и частиц, движущихся через это пространство. Когда частицы перемещаются слишком далеко от каких-либо точек, мне нужно вернуть их обратно. Сейчас я пытаюсь взять частицы, которые находятся дальше от ближайшей точки, чем эта точка, до ближайшего соседа, и вытянуть их обратно к ближайшей. точка.

 install.packages("rgeos")
 library(rgeos)

первый набор точек (множество из множества)

 points <- data.frame(matrix(nrow=19,ncol=2))
 colnames(points) <- c("X","Y")
 points$X <- c(5136, 5293, 5393, 5381, 5299, 5310, 4984, 5112, 
 5213, 5111, 5317, 5264,5075, 5313, 5228, 5237, 5071, 5120, 5067)
 points$Y <- c( 5427, 5399, 5381, 5371, 5370, 5364, 5321, 5317, 
 5321, 5295, 5297, 5284,5226, 5273, 5273, 5264, 5251, 5219, 5212)

частиц в текущей точке

 particles <- data.frame(matrix(nrow=19,ncol=3))
 colnames(particles) <- c("name","X","Y")
 particles$name <- c("a","b","c","d","e","f","g","h","i","j",
                     "k","l","m","n","o","p","q","r","s")
 particles$X <-  c(5139, 5289, 5398, 5377, 5298, 5312, 4983, 5113, 
 5211, 5113, 5317, 5263,
 5073, 5309, 5230, 5234, 5065, 5120, 5067)
 particles$Y <- c(5427, 5399, 5381, 5372, 5369, 5364, 5321, 
 5318,5321, 5295, 5297, 5285, 5226, 5273,5273, 5264, 5251, 5219,
 5212)

расстояние от частицы до ближайшей точки

 particletopoint <-as.vector(apply(gDistance(SpatialPoints(points),SpatialPoints(particles[,2:3]),byid=TRUE),1,min))

расстояние от точки до ближайшего соседа (они составлены, поскольку я не использую все возможные точки здесь, но в любом случае получу вектор 19)

 pointtoneighbor <- c(4,4,5,4,2,3,3,4,4,3,2,1,4,3,3,2,5,1,1)

поэтому мне нужно отредактировать "частицы" df, чтобы изменить координаты тех, которые находятся слишком далеко от их ближайшей точки обратно к координатам самой близкой точки. Здесь я начинаю получать ошибки.

Использование только

 pointtoneighbor>= particletopoint
 [1]  TRUE  TRUE  TRUE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE  TRUE FALSE  TRUE FALSE FALSE  TRUE  TRUE

Я вижу, что нужно изменить 5 координат частиц, но я не совсем уверен, как использовать apply () для этого.

 particles[2:3] <- mapply(function(x) if (pointtoneighbor >= particletopoint) x else points,particles[2:3])

Я думаю, что проблема заключается в том, чтобы не указывать коду, какой элемент в точках [] использовать, но я не знаю, как это исправить.

Я тоже пробовал

 particles[,2:3] <- mapply(function(x)ifelse(pointtoneighbor>=particletopoint,x,points),particles[,2:3])

Но это дало мне другую ошибку.

Кстати, я хочу сделать это с помощью функции apply, а не цикла for для эффективности. Это будет большой набор данных.

Заранее спасибо.

1 Ответ

1 голос
/ 12 июня 2019

Если я правильно истолковал вашу формулировку проблемы, проблема, похоже, связана с ifelse (не совсем понятно, почему, может быть, кто-то другой может решить эту проблему!).Следующее должно работать для вас:

particles[,2:3] <- as.data.frame(t(mapply(function(i) {
  if(pointtoneighbor[i] >= particletopoint[i]){
    particles[i,2:3]
  } else {
    points[i,1:2]
  }
}, seq_along(pointtoneighbor))))

Это идет по каждому индексу pointtoneighbor и particletopoint, и если оно ложно, соответствующая строка points заменяет строку particles.В противном случае вы сохраняете строку particles.

...