我有一個如下所示的資料集:
structure(list(X = c(36, 37, 38, 39, 40, 41, 1, 2, 3, 4, 5, 6
), Y = c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1), region_ID = c(0,
0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1)), row.names = c(NA, -12L), class = c("data.table",
"data.frame"), .internal.selfref = <pointer: 0x7fb8fc819ae0>)
我想將每一行region_ID=0與其region_ID=1和計算的行相匹配
dist_to_r1=sqrt((X - i.X)^2 (Y - i.Y)^2))
其中i.前綴是指后面的行。我想使用資料表語法來做到這一點。
我一直在嘗試使用左連接來執行此操作,但無法使其作業。
uj5u.com熱心網友回復:
您想要一個完全連接,這樣區域 0 中的六行中的每一行都連接到區域 1 中的六行?
在這種情況下,您可以簡單地設定allow.cartesian = T:
data[, id:=1][region_ID==0][data[region_ID==1], on ="id", allow.cartesian=T][, dist_to_r1:=sqrt((X-i.X)^2 (Y-i.Y)^2)][]
編輯:OP 澄清說,只需要到區域 0 中的點的最小距離。在這種情況下,我們可以這樣做:
data[,id:=1]
region0 = data[region_ID==0]
# function that gets the minimum distance between two regions
get_min_dist <- function(region_a, region_b) {
region_a[region_b, on="id", allow.cartesian=T][,min(sqrt((X-i.X)^2 (Y-i.Y)^2))]
}
# apply the function above to every region
data[,
(min_dist_to_zero = get_min_dist(
region_a = region0,
region_b = data[region_ID==.BY]
)),
by=region_ID]
輸出:
region_ID min_dist_to_zero
1: 0 0
2: 1 30
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/420139.html
標籤:
下一篇:如何重現學生表?
