【问题标题】:JSON applied over a dataframe in RJSON应用于R中的数据框
【发布时间】:2019-01-20 01:15:54
【问题描述】:

我在一个网站上使用了以下内容,它返回了一个完美的结果:

寻找关键字:Emaar 粘贴在查询末尾:

library(httr)
library(jsonlite)



query<-"https://www.googleapis.com/customsearch/v1?key=AIzaSyA0KdZHRkAjmoxKL14eEXp2vnI4Yg_po38&cx=006431301429107149113:as7yqcm2qc8&q=Emaar"

result11 <- content(GET(query))
print(result11)
result11_JSON <- toJSON(result11)
result11_JSON <- fromJSON(result11_JSON)
result11_df <- as.data.frame(result11_JSON)

现在我想在包含关键词的 data.frame 上应用相同的函数:

所以我做了以下测试 .csv 文件:

     Company Name
[1]  ADES International Holding Ltd
[2]  Emirates REIT (CEIC) Limited
[3]  POLARCUS LIMITED

称之为测试网站提取.csv

使用的代码:

test_companies <- read.csv("... \\Testing Website Extraction.csv")

#removing space and adding "+" sign then pasting query before it (query already has my unique google key and search engine ID
test_companies$plus <- gsub(" ", "+", test_companies$Company.Name)


query <- "https://www.googleapis.com/customsearch/v1?key=AIzaSyCmD6FRaonSmZWrjwX6JJgYMfDSwlR1z0Y&cx=006431301429107149113:as7yqcm2qc8&q="

test_companies$plus <- paste0(query, test_companies$plus)

a <- test_companies$plus
length(a)
function_webs_search <- function(web_search) {content(GET(web_search))}



result <- lapply(as.character(a), function_webs_search)

此处的结果显示长度为 3 的列表(3 个搜索词)和每个词中的子列表,其中包含:url (list[2])、query (list[2])、... items (list[10])这些对于每个搜索词都是相同的(分别相同的长度),我的问题是应用代码的其余部分

#when i run:
result_JSON <- toJSON(result)
result_JSON <- as.list(fromJSON(result_JSON))

我得到一个包含 6 个子列表的列表

并将其放入一个整洁的数据框中,结果被证明是困难的,结果彼此列在下面(而不是单独列出)

还请注意,我尝试从包含 3 个单独列表的“结果”列表中获取每个单独的列表,但如果我有更长的关键字列表,则需要大量的体力劳动

预期的最终结果应包括 37 个变量的 30 个观察值(对于每个搜索词,37 个变量的 10 个观察值,并且都在彼此之下。

我尝试失败的事情:

These work to flatten the list:
#do.call(c , result)
#all.equal(listofvectors, res, check.attributes = FALSE)
#unlist(result, recursive = FALSE)
# for (i in 1:length(result))  {listofvectors <- c(listofvectors, result[[i]])}
#rbind()
#rbind.fill()

即使在展平之后,我也不知道如何将它们组织成一个整洁的最终输出,以供非 R 用户与之交互。

我们将不胜感激任何帮助,

我在这里,以防我的问题有什么不清楚的地方,

总是很高兴了解更多关于 R 的信息,所以请多多包涵,因为我刚刚开始赶上。

一切顺利,提前致谢!

【问题讨论】:

  • url 调用的内容很多,在转换为data.frame 时,很多项目被回收(回收较短的长度以匹配较长的长度)。不确定您要通过有效的fromJSON(toJSON(content(GET(ur)))) 实现什么。由于回收data.frame 对象会有很多不正确的信息。如果你想从查询输出中提取特定的东西,你应该多分析一下结构。
  • 您好,我正在尝试提取每个公司的前 10 个结果,然后将它们全部合并到一个数据框下(每个公司 10 个和 37 个变量的 30 个观察值)
  • 请将问题简化为minimal reproducible example。特别是,如果查询返回预期结果,则不是问题,可以用硬编码数据替换。此外,如果 JSON 解码不是问题,也可以将其删除。

标签: r json list jsonlite


【解决方案1】:

基本上我所做的只是从数据框列表中提取我需要的列,下面是最终代码:

library(httr)
library(jsonlite)
library(tidyr)
library(stringr)
library(purrr)
library(plyr)


test_companies <- read.csv("c:\\users\\... Companies Without Websites List.csv")

test_companies$plus <- gsub(" ", "+", test_companies$Company.Name)


query <- "https://www.googleapis.com/customsearch/v1?key=AIzaSyCmD6FRaonSmZWrjwX6JJgYMfDSwlR1z0Y&cx=006431301429107149113:as7yqcm2qc8&q="

test_companies$plus <- paste0(query, test_companies$plus)

a <- test_companies$plus
length(a)
function_webs_search <- function(web_search) {content(GET(web_search))}



result <- lapply(as.character(a), function_webs_search)

function_toJSONall <- function(all) {toJSON(all)}

a <- lapply(result, function_toJSONall)


function_fromJSONall <- function(all) {fromJSON(all)}

b <- lapply(a, function_fromJSONall)


function_dataframe <- function(all) {as.data.frame(all)}

c <- lapply(b, function_dataframe)

function_column <- function(all) {all[ ,15:30]}

result_final <- lapply(c, function_column)

results_df <- rbind.fill(c[])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多