0
我有一個包含位置信息(Lat = latitude,Lon = longitude)的+100 000行data.frame A和另一個data.frame B with + 500行包含地理區域限制(區域不重疊)。基於一個data.frame和另一個條件中的值返回一個向量
如何根據A中的位置創建一個從B返回地名的函數?
我想R'當在乙存在的位置,「未分配」的情況下,當一個位置不在案件存在和NA當任緯度或經度所述的
缺少返回地名的向量例子:
dataA <- structure(list(Lat = c(60L, 63L, 0L, 75L, NA, 71L, 70L), Lon = c(-70L,
-66L, 5L, -100L, 80L, -61L, -150L)), .Names = c("Lat", "Lon"), class = "data.frame", row.names = c(NA,
-7L))
dataB <- structure(list(Region = structure(c(2L, 3L, 1L), .Label = c("Beaufort Sea",
"Hudson Strait", "North West Passage"), class = "factor"), Lat.min = c(55,
70, 69.5), Lat.max = c(65L, 80L, 72L), Lon.min = c(-75L, -120L,
-160L), Lon.max = c(-60L, -60L, -120L)), .Names = c("Region",
"Lat.min", "Lat.max", "Lon.min", "Lon.max"), class = "data.frame", row.names = c(NA,
-3L))
## I would like to test for each row in dataA:
i <- 1 ## i <- 1:nrow(dataB)
dataA$Lat > dataB$Lat.min[i] & dataA$Lat < dataB$Lat.max[i] &
dataA$Lon > dataB$Lon.min[i] & dataA$Lon < dataB$Lon.max[i]
## and return
dataB$Region[i] ## only once for each row of dataA,
##unless is.na(dataA$Lat) | is.na(dataA$Lon), then return(NA),
##and if a row in dataA does not match any row in dataB, then return "not assigned"
## The result should look something like:
c("Hudson Strait", "Hudson Strait", "not assigned", "North West Passage",
NA, "North West Passage", "Beaufort Sea")
有什麼我想:我已經解決了使用ifelse
功能以前類似的挑戰,但在這種情況下,我的條件data.frame過於龐大手動執行此操作。我也嘗試split
data.frame A並運行條件for
循環,但沒有弄清楚如何制定for循環。如果我在循環中使用if
語句,我的循環將返回與A中每行的B值中的行數相同的值。我也有一種感覺,爲該數據集運行for循環需要很長時間,而不是何況分裂data.frame A的大小有一定這樣做的更好的辦法...