ifelse inside mapply() 替换 df 中的坐标
ifelse inside mapply() to replace coordinates in a df
我需要写一行代码来找到越界的坐标,并将它们改回边界。我正在尝试将 mapply() 与 ifelse() 一起使用,但我不断收到错误。示例如下。
我有一个空间点列表(x,y 坐标)和穿过该点的粒子 space。当粒子从任何点移动太远时,我需要将它们卷回。现在,我正在尝试获取距离最近的点比该点距离最近的点更远的粒子,并将它们拉回最近的点点.
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)
所以我需要编辑 "particles" 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])
但这给了我一个不同的错误。
顺便说一句,为了提高效率,我想使用应用函数而不是 for 循环来执行此操作。它将在一个大数据集上。
提前致谢。
如果我正确解释了您的问题陈述,问题似乎与 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
行。
我需要写一行代码来找到越界的坐标,并将它们改回边界。我正在尝试将 mapply() 与 ifelse() 一起使用,但我不断收到错误。示例如下。
我有一个空间点列表(x,y 坐标)和穿过该点的粒子 space。当粒子从任何点移动太远时,我需要将它们卷回。现在,我正在尝试获取距离最近的点比该点距离最近的点更远的粒子,并将它们拉回最近的点点.
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)
所以我需要编辑 "particles" 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])
但这给了我一个不同的错误。
顺便说一句,为了提高效率,我想使用应用函数而不是 for 循环来执行此操作。它将在一个大数据集上。
提前致谢。
如果我正确解释了您的问题陈述,问题似乎与 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
行。