如何在R中用SQL式查询大型WGS84格式JSON地址数据?
简便实现R中SQL式查询JSON地址数据的方法
针对你需要高效处理数千次经纬度查询的需求,以下是几种无需复杂Rectangling的简便方案:
1. 先把JSON转成结构化数据框
首先用jsonlite包快速导入JSON并转为数据框,内置的扁平化参数可以自动处理轻度嵌套结构,省去手动拆解的麻烦:
library(jsonlite) # 导入JSON文件,flatten参数自动处理嵌套字段 df <- fromJSON("你的文件路径.json", flatten = TRUE)
2. 三种SQL风格查询方案
方案一:用dplyr(类SQL语法,简洁易读)
dplyr的动词和SQL逻辑一一对应,还能给查询字段建立索引提升多次查询效率:
library(dplyr) # 给Address和LFNAME建立索引,优化后续批量查询速度 df_indexed <- df %>% index_by(Address, LFNAME) # 对应你要的SQL查询逻辑 result <- df_indexed %>% filter(Address == "160", LFNAME == "Transit Rd") %>% select(Latitude, Longitude)
方案二:用sqldf(直接写SQL语句)
完全贴合你的SQL使用习惯,直接执行熟悉的SQL语法:
library(sqldf) # 注意SQL语句里字符串用单引号,避免和R的双引号冲突 result <- sqldf("SELECT Latitude, Longitude FROM df WHERE Address = '160' AND LFNAME = 'Transit Rd'")
方案三:用data.table(最高效的批量查询)
如果要处理数千次查询,优先选data.table,索引查询的速度远超普通数据框:
library(data.table) # 转成data.table格式 dt <- as.data.table(df) # 给查询字段设置主键索引 setkey(dt, Address, LFNAME) # 两种查询方式,都能快速定位数据 # 方式1:利用主键索引直接匹配 result <- dt[.("160", "Transit Rd"), .(Latitude, Longitude)] # 方式2:类SQL的条件筛选 result <- dt[Address == "160" & LFNAME == "Transit Rd", .(Latitude, Longitude)]
注意事项
- 如果JSON嵌套较深,
fromJSON(flatten = TRUE)基本能覆盖大部分场景,无需手动做Rectangling。 - 批量查询时,data.table的索引机制能把单次查询的时间复杂度降到O(log n),最适合数千次查询的场景。
内容的提问来源于stack exchange,提问作者Richard Rogers
相关产品推荐
相关产品推荐

