我正在尝试根据记录的位置对表中的记录进行分类。我将区域划分为等宽和等高的9个正方形(宽度!=高度),并希望创建一个新列,在该列中,根据记录所属的正方形为每个记录赋予一个标签。我所能做的最好:
library(tidyverse)
set.seed(123)
latitude = 10*runif(100)
longitude = 10*runif(100)
locations = data.frame(latitude, longitude)
max_lat <- max(locations$latitude)
min_lat <- min(locations$latitude)
max_lng <- max(locations$longitude)
min_lng <- min(locations$longitude)
grid_num_lat <- 3
grid_num_lng <- 3
step_lat <- (max_lat-min_lat)/grid_num_lat
step_lng <- (max_lng-min_lng)/grid_num_lng
locations <- locations %>%
mutate(grp_lat = ifelse(latitude <= (min_lat+step_lat), "A",
ifelse(latitude <= (min_lat+(2*step_lat)), "B",
ifelse(latitude <= (min_lat+(3*step_lat)), "C", "NA")))
, grp_lng = ifelse(longitude <= (min_lng+step_lng), "1",
ifelse(longitude <= (min_lng+(2*step_lng)), "2",
ifelse(longitude <= (min_lng+(3*step_lng)), "3", "NA")))
, grp_loc = paste(grp_lat, grp_lng))
虽然这对于我当前的目的有效,但是如果我想将区域划分为更多或更少的正方形,则更新代码将很烦人。当然,有一种更简单的方法可以实现这一目标?
提前致谢
我们可以通过向量化的方式 findInterval
library(dplyr)
library(stringr)
out1 <- locations %>%
mutate(grp_lat = LETTERS[findInterval(latitude,
(min_lat + seq_len(3) *step_lat),
rightmost.closed = TRUE)+ 1],
grp_lng = findInterval(longitude,
(min_lng + seq_len(3) *step_lng),
rightmost.closed = TRUE)+ 1,
grp_loc = str_c(grp_lat, grp_lng, sep= ' ') )
-检查OP的输出
all.equal(out$grp_loc, out1$grp_loc)
#[1] TRUE
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句