好的,按照要求,我會添加更多的信息,以便您明白爲什麼簡單的矢量操作是不可能的。用幾句話來解釋並不容易,但讓我們拭目以待。我在2D空間上有大量的點數。 我把我的空間分成一個給定的分辨率,比如100米。我不確定是否強制的主循環(歡迎任何替代方法)是通過每個包含至少2個點的單元格/像素(現在我正在使用spatstat包中的方法quadratcount)。 在這個循環中,因此對於這些非空單元格中的每一個,我必須找到並保留最多10個彼此相距3米以內的男 - 女對。 3米長的緩衝區可以使用spatstat中的「光盤」功能完成。要選擇落入緩衝區內的點,可以使用SDMTools包中的方法pnt.in.poly。所有這些都是因爲像素的最大容量不能超過。因爲在每個單元格中可能有數百或數千個點,所以我試圖找到一種巧妙的方法來使用另一個循環/類似的方法來:1)每次點擊每個點2)創建一個具有不同性別的選擇點3)將最接近的男 - 女(0-1)對保存在另一個數據框(稱爲new_colonies)中4)從數據框中刪除這些點,使其縮小並且不必再考慮它們5)數據幀到達10行會停止所有操作並轉到下一個單元格(從而跳過所有剩餘的點,下面是我開發的用於在每個單元格內運行的代碼(現在需要太長時間):在R循環中動態刪除元素
head(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))'。此外,瞭解一些特定情況會很好,因爲你可能甚至不需要循環,但可以通過矢量化的方式解決它。 –
可能試試?子集 – aatrujillob
我會盡快列出我需要用相關代碼做的所有事情,只要它允許我放棄我自己的問題並在這裏發帖......很快檢查一下,如果你能幫助我,那將很棒! – Francesco