当前位置: 首页 > 知识库问答 >
问题:

如何将JSON输出提取到DataFrame?

何楷
2023-03-14

我有一个包含3000多条记录的数据框架,其中包括每次观测的经纬度坐标。我想从每一组坐标中得到国家和州或省。

或者,一个更好的解决我的问题,获得空间信息是赞赏的!

下面是我的代码:

library(RDSTK)
library(httr)
library(rjson)
Coords <- structure(list(Latitude = c(43.30528, 46.08333, 32.58333, 46.25833, 45.75, 46.25, 45.58333, 45.58333, 44.08333, 45.75), 
                         Lontitude = c(-79.80306, -82.41667, -117.08333, -123.975, -85.75, -123.91667, -86.75, -86.75, -76.58333, -85.25
                                         )), .Names = c("Latitude", "Longitude"), row.names = c(1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L,9L, 10L), class = "data.frame")

json_file <- fromJSON(coordinates2politics(Coords$Latitude, Coords$Longitude))

共有1个答案

彭衡
2023-03-14

我更喜欢在R中使用jsonlite解析JSON。

要解析嵌套的JSON列表,可以在lapply中执行fromjson调用。

JSONLite::FromJSON试图简化结果。但是,由于JSON被设计为处理嵌套的数据结构,所以通常会返回一个列表的data.frame,因此要获得您要获取的data.frame,您需要知道您想要的列表中的哪个元素,并提取它。

例如

library(RDSTK)
library(jsonlite)

js <- coordinates2politics(Coords$Latitude, Coords$Longitude)
lst <- lapply(js, jsonlite::fromJSON)

lst[[1]]$politics
#           type friendly_type                       name  code
# 1       admin2       country                     Canada   can
# 2       admin4         state                    Ontario  ca08
# 3 constituency  constituency            Hamilton Centre 35031
# 4 constituency  constituency                 Burlington 35010
# 5 constituency  constituency Hamilton East-Stoney Creek 35032

要获取data.frame,可以构造另一个lapply来提取所需的元素,然后将其与do.call(...,rbind)或我的首选项与data.table::rbindlist(...)放在一起

lst_result <- lapply(lst, function(x){
    df <- x$politics[[1]]
    df$lat <- x$location$latitude
    df$lon <- x$location$longitude
    return(df)
})

data.table::rbindlist(lst_result)

#            type friendly_type                                  name                   code      lat        lon
# 1:       admin2       country                                Canada                    can 43.30528  -79.80306
# 2:       admin4         state                               Ontario                   ca08 43.30528  -79.80306
# 3: constituency  constituency                       Hamilton Centre                  35031 43.30528  -79.80306
# 4: constituency  constituency                            Burlington                  35010 43.30528  -79.80306
# 5: constituency  constituency            Hamilton East-Stoney Creek                  35032 43.30528  -79.80306
# 6:       admin2       country                                Canada                    can 46.08333  -82.41667
# 7:       admin4         state                               Ontario                   ca08 46.08333  -82.41667

或者,要获得关于每个LAT/LON的更多细节,您可以通过库(googleway)(免责声明:我写了googleway)使用Google的API,对LAT/LON进行反向地理编码。

为此,您需要一个有效的Google API密钥(除非您付费,否则每天仅限2500个请求)

library(googleway)

key <- "your_api_key"

lst <- apply(Coords, 1, function(x){
    google_reverse_geocode(location = c(x["Latitude"], x["Longitude"]),
                           key = key)
})

lst[[1]]$results$address_components
# [[1]]
#                              long_name                           short_name                                  types
# 1 Burlington Bay James N. Allan Skyway Burlington Bay James N. Allan Skyway                                  route
# 2                           Burlington                           Burlington                    locality, political
# 3         Halton Regional Municipality         Halton Regional Municipality administrative_area_level_2, political
# 4                              Ontario                                   ON administrative_area_level_1, political
# 5                               Canada                                   CA                     country, political
# 6                                  L7S                                  L7S        postal_code, postal_code_prefix

或者类似地通过库(ggmap),这也受到Google的2500个限制。

library(ggmap)

apply(Coords, 1, function(x){
    revgeocode(c(x["Longitude"], x["Latitude"]))
})

# 1 
# "Burlington Bay James N. Allan Skyway, Burlington, ON L7S, Canada" 
# 2 
# "308 Brennan Harbour Rd, Spanish, ON P0P 2A0, Canada" 
# 3 
# "724 Harris Ave, San Diego, CA 92154, USA" 
# 4 
# "30 Cherry St, Chinook, WA 98614, USA" 
# 5 
# "St James Township, MI, USA" 
# 6 
# "US-101, Chinook, WA 98614, USA" 
# 7 
# "2413 II Rd, Garden, MI 49835, USA" 
# 8 
# "2413 II Rd, Garden, MI 49835, USA" 
# 9 
# "8925 S Shore Rd, Stella, ON K0H 2S0, Canada" 
# 10 
# "Charlevoix County, MI, USA"
 类似资料:
  • 我有JSON: 如何将年龄值分配给Kotlin中JSON中的user_age变量?或者用JSON输出年龄值?

  • 问题内容: 我在将选项卡中的JSON输出到HTML表时遇到了麻烦(这是javascript / jQuery夜间课程分配的一部分)。请有人看看,并建议我要对表格格式的输出进行哪些修改?我收到成功警报,但表未填充。 谢谢。 和HTML: 问题答案: 代码的主要问题是,在AJAX请求成功完成后,您没有调用任何函数。您至少需要致电才能填充数据。 但是,您可以对代码进行一些改进。首先,删除。这是默认值,并

  • 问题在于在进行案例类提取时映射函数中。case类不可序列化。我隐式地定义了格式。 错误是: INFO[main](TypeExtractor.java:1804)-未检测到类组织的字段。json4s。JsonAST$JValue。不能用作PojoType。将作为线程“main”组织中的GenericType异常处理。阿帕奇。Flink。应用程序编程接口。常见的InvalidProgrameExce

  • 数据:“{\”数据\“:[\”124“,\”611“]}”,Lasteventid:“”} 是否可以只抓取,因为否则客户端在反序列化方面会出现问题。

  • 问题内容: 我有一个用Java编写的exe文件。我知道可以将Java程序制作为exe,并且有将jar文件转换为exe的工具,但是可以转换回来吗?AFAIK jar文件可以在可以运行Java的任何平台上运行,我想在Mac上使用Windows编译的Java程序,而无需使用任何额外的虚拟化(葡萄酒,vmware) 问题答案: 这取决于exe的构建方式: 如果它只是用JSmooth之类的工具(如该线程所建

  • 问题内容: 我有这个模板: 呈现为: 如果我将其发送到http.ResponseWriter,则输出文本将转义。 我怎么能这样写一个json? 问题答案: 您不应该使用Go的模板引擎(也不是)来生成JSON输出,因为模板引擎不了解JSON语法和规则(转义)。 而是使用包来生成JSON。您可以用来直接将响应写入/流式传输到,例如。 例: 输出(在Go Playground上尝试):