在mapply()中使用ifelse替换df

时间:2019-06-11 21:38:11

标签: r if-statement coordinates mapply rgeo

我需要写一行代码,将找到超出范围的坐标,并将其改回范围。我正在尝试将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])

我认为问题与不告诉代码要使用points []中的哪个元素有关,但我不知道如何解决。

我也尝试过

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

但这给了我一个不同的错误。

顺便说一句,我想使用apply函数而不是for循环来实现此目的。它将在大型数据集上。

谢谢。

1 个答案:

答案 0 :(得分:1)

如果我正确解释了您的问题说明,则问题似乎出在vid.ondurationchange上(不确定原因,也许其他人可以解决!)。以下应该适合您:

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行。