【发布时间】:2011-12-31 17:22:30
【问题描述】:
好的,伙计们,根据要求,我将添加更多信息,以便您了解为什么无法进行简单的矢量运算。用几句话来解释并不容易,但让我们看看。我在 2D 空间上有很多点。 我将我的空间划分为一个给定分辨率的网格,比如 100m。我不确定它是否是强制性的(欢迎任何替代方案)的主循环是遍历每个包含至少 2 个点的单元/像素(现在我正在使用包 spatstat 中的方法 quadratcount)。 在这个循环内,因此对于每个非空单元格,我必须找到并保留最多 10 对彼此相距 3 米以内的男女对。可以使用 spatstat 中的“disc”功能完成 3 米缓冲区。要选择落在缓冲区内的点,您可以使用 SDMTools 包中的 pnt.in.poly 方法。这一切都是因为像素具有无法超过的最大容量。由于在每个单元格中可能有数百或数千个点,我试图找到一种聪明的方法来使用另一种循环/类似方法: 1)一次遍历每个点 2)创建一个缓冲区以选择具有不同性别的点 3)将最近的男性 - 女性(0-1)对保存在另一个数据框中(称为 new_colonies) 4)从数据框中删除这些点,以便它缩小了,我不必再考虑它们了 5)一旦新的数据帧达到 10 行,就会停止一切并转到下一个单元格(从而跳过所有剩余的点。这是我开发的要在其中运行的代码每个单元格(现在需要太长时间):
头部(df,20):
X Y Sex ID
2 583058.2 2882774 1 1
3 582915.6 2883378 0 2
4 582592.8 2883297 1 3
5 582793.0 2883410 1 4
6 582925.7 2883397 1 5
7 582934.2 2883277 0 6
8 582874.7 2883336 0 7
9 583135.9 2882773 1 8
10 582955.5 2883306 1 9
11 583090.2 2883331 0 10
12 582855.3 2883358 1 11
13 582908.9 2883035 1 12
14 582608.8 2883715 0 13
15 582946.7 2883488 1 14
16 582749.8 2883062 0 15
17 582906.4 2883317 0 16
18 582598.9 2883390 0 17
19 582890.2 2883413 0 18
20 582752.8 2883361 0 19
21 582953.1 2883230 1 20
在每个单元格中,我必须按照我上面解释的内容运行一些东西..
for(i in 1:dim(df)[1]){
new_colonies <- data.frame(ID1=0,ID2=0,X=0,Y=0)
discbuff <- disc(radius, centre=c(df$X[i], df$Y[i]))
#define the points and polygon
pnts = cbind(df$X[-i],df$Y[-i])
polypnts = cbind(x = discbuff$bdry[[1]]$x, y = discbuff$bdry[[1]]$y)
out = pnt.in.poly(pnts,polypnts)
out$ID <- df$ID[-i]
if (any(out$pip == 1)) {
pnt.inBuffID <- out$ID[which(out$pip == 1)]
cond <- df$Sex[i] != df$Sex[pnt.inBuffID]
if (any(cond)){
eucdist <- sqrt((df$X[i] - df$X[pnt.inBuffID][cond])^2 + (df$Y[i] - df$Y[pnt.inBuffID][cond])^2)
IDvect <- pnt.inBuffID[cond]
new_colonies_temp <- data.frame(ID1=df$ID[i], ID2=IDvect[which(eucdist==min(eucdist))],
X=(df$X[i] + df$X[pnt.inBuffID][cond][which(eucdist==min(eucdist))]) / 2,
Y=(df$Y[i] + df$Y[pnt.inBuffID][cond][which(eucdist==min(eucdist))]) / 2)
new_colonies <- rbind(new_colonies,new_colonies_temp)
if (dim(new_colonies)[1] == maxdensity) break
}
}
}
new_colonies <- new_colonies[-1,]
任何帮助表示赞赏! 谢谢 弗朗切斯科
【问题讨论】:
-
欢迎来到 SO,请尝试给我们一个可重现的例子,例如通过使用
dput(head(df,10))。此外,如果您了解该特定条件,那将是一件好事,因为您可能甚至不需要循环,但可以通过矢量化方式解决它。 -
我将指定我需要对相关代码做的所有事情,只要它可以让我回答我自己的问题并在此处发布...尽快检查它,如果你能帮助我,那就太好了!
-
@Francesco - 您可以(并且应该)简单地编辑您的问题!
-
@Tommy...谢谢,我是新来的,所以我不知道我可以编辑我的帖子。
-
您应该说明如何选择要保留的 10 个……前 10 个?、彼此最近的 10 个?、随机 10 个……等等。
标签: list r for-loop foreach dataframe