Google 放置 API 和 R -- 在数据框中调用第二列 returns 六列
Google Places API and R -- calling 2nd column in a data frame returns six separate columns
我正在尝试存储通过 Google 位置 API 从列表中检索到的数据框的结果。我打电话给 API...
library(googleway)
HAVE_PLACES <- google_places(search_string = "grocery store",
location = c(35.4168, -80.5883),
radius = 10000, key = key)
...returns 一个列表对象 HAVE_PLACES
:
此列表中的第三个对象 - results
- 是一个数据框,其中对 API 调用中检索到的每个位置都有一个观察值。当我调用 View(HAVE_PLACES$results)
时,我得到了一组向量 - 正如我在查看数据框时所期望的那样...
...但是看起来数据框包含个数据框:
这是怎么回事?
更具体地说:
- 数据框如何包含数据框,为什么
View()
将嵌套数据框显示为向量?
- 当处理这种类型的数据时,您希望您在
View()
中看到的列只是向量 - 用于操作和导出目的 - 是有什么最佳实践吗?我即将将这个名为 geometry
的所谓数据框的每个向量转换为单独的对象,并将 cbind()
结果转换为 HAVE_PLACES$results
。但这感觉很疯狂。
Akrun 是对的(一如既往!)。 data.frame 可以有列表 'columns'。这是正常行为。
您的问题似乎是关于如何在 R 中提取嵌套列表数据的更普遍的问题,但以 Google 的 API 响应为例。鉴于您正在使用 googleway
(我是该软件包的作者),我将在 Google 的回复中回答它。但是,关于如何在 R 中使用列表,还有许多其他在线答案和示例。
说明
您在结果中看到了嵌套列表,因为从 Google 的 API 返回的数据实际上是 JSON。 google_places()
函数 'simplifies' 在内部使用 jsonlite::fromJSON()
到 data.frame
。
如果您在函数调用中设置 simplify = F
您可以看到原始的 JSON 输出
library(googleway)
set_key("GOOGLE_API_KEY")
HAVE_PLACES_JSON <- google_places(search_string = "grocery store",
location = c(35.4168, -80.5883),
radius = 10000,
simplify = F)
## run this to view the JSON.
jsonlite::prettify(paste0(HAVE_PLACES_JSON))
您会看到 JSON 可以包含许多嵌套对象。当转换为 R data.frame
时,这些嵌套对象作为列表列返回'
如果您不熟悉 JSON,可能值得进行一些研究以了解它的全部内容。
提取数据
我已经编写了一些函数来从 API 响应中提取有用的信息,这可能对这里有帮助
locations <- place_location(HAVE_PLACES)
head(locations)
# lat lng
# 1 35.38690 -80.55993
# 2 35.42111 -80.57277
# 3 35.37006 -80.66360
# 4 35.39793 -80.60813
# 5 35.44328 -80.62367
# 6 35.37034 -80.54748
placenames <- place_name(HAVE_PLACES)
head(placenames)
# "Food Lion" "Food Lion" "Food Lion" "Food Lion" "Food Lion" "Food Lion"
但是请注意,您仍然会返回一些列表对象,因为在这种情况下,一个 'location' 可以有多个 'types'
placetypes <- place_type(HAVE_PLACES)
str(placetypes)
# List of 20
# $ : chr [1:5] "grocery_or_supermarket" "store" "food" "point_of_interest" ...
# $ : chr [1:5] "grocery_or_supermarket" "store" "food" "point_of_interest" ...
# $ : chr [1:5] "grocery_or_supermarket" "store" "food" "point_of_interest" ...
# $ : chr [1:5] "grocery_or_supermarket" "store" "food" "point_of_interest" ...
总结
对于 Google 的 API 响应,您必须提取所需的特定数据元素并将它们构建到所需的对象中
df <- cbind(
place_name(HAVE_PLACES)
, place_location(HAVE_PLACES)
, place_type(HAVE_PLACES)[[1]] ## only selecting the 1st 'type'
)
head(df)
# place_name(HAVE_PLACES) lat lng place_type(HAVE_PLACES)[[1]]
# 1 Food Lion 35.38690 -80.55993 grocery_or_supermarket
# 2 Food Lion 35.42111 -80.57277 store
# 3 Food Lion 35.37006 -80.66360 food
# 4 Food Lion 35.39793 -80.60813 point_of_interest
# 5 Food Lion 35.44328 -80.62367 establishment
# 6 Food Lion 35.37034 -80.54748 grocery_or_supermarket
我正在尝试存储通过 Google 位置 API 从列表中检索到的数据框的结果。我打电话给 API...
library(googleway)
HAVE_PLACES <- google_places(search_string = "grocery store",
location = c(35.4168, -80.5883),
radius = 10000, key = key)
...returns 一个列表对象 HAVE_PLACES
:
此列表中的第三个对象 - results
- 是一个数据框,其中对 API 调用中检索到的每个位置都有一个观察值。当我调用 View(HAVE_PLACES$results)
时,我得到了一组向量 - 正如我在查看数据框时所期望的那样...
...但是看起来数据框包含个数据框:
这是怎么回事?
更具体地说:
- 数据框如何包含数据框,为什么
View()
将嵌套数据框显示为向量? - 当处理这种类型的数据时,您希望您在
View()
中看到的列只是向量 - 用于操作和导出目的 - 是有什么最佳实践吗?我即将将这个名为geometry
的所谓数据框的每个向量转换为单独的对象,并将cbind()
结果转换为HAVE_PLACES$results
。但这感觉很疯狂。
Akrun 是对的(一如既往!)。 data.frame 可以有列表 'columns'。这是正常行为。
您的问题似乎是关于如何在 R 中提取嵌套列表数据的更普遍的问题,但以 Google 的 API 响应为例。鉴于您正在使用 googleway
(我是该软件包的作者),我将在 Google 的回复中回答它。但是,关于如何在 R 中使用列表,还有许多其他在线答案和示例。
说明
您在结果中看到了嵌套列表,因为从 Google 的 API 返回的数据实际上是 JSON。 google_places()
函数 'simplifies' 在内部使用 jsonlite::fromJSON()
到 data.frame
。
如果您在函数调用中设置 simplify = F
您可以看到原始的 JSON 输出
library(googleway)
set_key("GOOGLE_API_KEY")
HAVE_PLACES_JSON <- google_places(search_string = "grocery store",
location = c(35.4168, -80.5883),
radius = 10000,
simplify = F)
## run this to view the JSON.
jsonlite::prettify(paste0(HAVE_PLACES_JSON))
您会看到 JSON 可以包含许多嵌套对象。当转换为 R data.frame
时,这些嵌套对象作为列表列返回'
如果您不熟悉 JSON,可能值得进行一些研究以了解它的全部内容。
提取数据
我已经编写了一些函数来从 API 响应中提取有用的信息,这可能对这里有帮助
locations <- place_location(HAVE_PLACES)
head(locations)
# lat lng
# 1 35.38690 -80.55993
# 2 35.42111 -80.57277
# 3 35.37006 -80.66360
# 4 35.39793 -80.60813
# 5 35.44328 -80.62367
# 6 35.37034 -80.54748
placenames <- place_name(HAVE_PLACES)
head(placenames)
# "Food Lion" "Food Lion" "Food Lion" "Food Lion" "Food Lion" "Food Lion"
但是请注意,您仍然会返回一些列表对象,因为在这种情况下,一个 'location' 可以有多个 'types'
placetypes <- place_type(HAVE_PLACES)
str(placetypes)
# List of 20
# $ : chr [1:5] "grocery_or_supermarket" "store" "food" "point_of_interest" ...
# $ : chr [1:5] "grocery_or_supermarket" "store" "food" "point_of_interest" ...
# $ : chr [1:5] "grocery_or_supermarket" "store" "food" "point_of_interest" ...
# $ : chr [1:5] "grocery_or_supermarket" "store" "food" "point_of_interest" ...
总结
对于 Google 的 API 响应,您必须提取所需的特定数据元素并将它们构建到所需的对象中
df <- cbind(
place_name(HAVE_PLACES)
, place_location(HAVE_PLACES)
, place_type(HAVE_PLACES)[[1]] ## only selecting the 1st 'type'
)
head(df)
# place_name(HAVE_PLACES) lat lng place_type(HAVE_PLACES)[[1]]
# 1 Food Lion 35.38690 -80.55993 grocery_or_supermarket
# 2 Food Lion 35.42111 -80.57277 store
# 3 Food Lion 35.37006 -80.66360 food
# 4 Food Lion 35.39793 -80.60813 point_of_interest
# 5 Food Lion 35.44328 -80.62367 establishment
# 6 Food Lion 35.37034 -80.54748 grocery_or_supermarket