【问题标题】:Convert JSON URL to R Data Frame将 JSON URL 转换为 R 数据框
【发布时间】:2016-05-09 07:01:00
【问题描述】:

我在将 JSON 文件(来自 API)转换为 R 中的数据框时遇到问题。例如 URL http://api.fantasy.nfl.com/v1/players/stats?statType=seasonStats&season=2010&week=1&format=json

我尝试了 S/O 的一些不同建议,包括 convert json data to data frame in R 和各种博文如http://zevross.com/blog/2015/02/12/using-r-to-download-and-parse-json-an-example-using-data-from-an-open-data-portal/

我最接近的是使用下面的代码,它给了我一个包含 4 个“行”和一堆“变量”(V1、V2 等)的大矩阵。我假设这个 JSON 文件的格式与“普通”文件的格式不同。

library(RJSONIO)

raw_data <- getURL("http://api.fantasy.nfl.com/v1/players/stats?statType=seasonStats&season=2010&week=1&format=json")

data <- fromJSON(raw_data)

final_data <- do.call(rbind, data)

我不知道如何让它工作,所以欢迎任何 R 包/进程。提前致谢。

【问题讨论】:

  • 你用的是什么包?我在 CRAN 上看到三个带有 fromJSON 函数的包(rjsonRJSONIOjsonlite)。
  • @MichaelChirico 抱歉,我会编辑。为此,它是 RJSONIO,但我已经尝试了所有三个都没有成功。

标签: json r dataframe


【解决方案1】:

jsonlite 已加载

library(jsonlite)

quandl_url的定义

quandl_url <- "https://www.quandl.com/api/v3/datasets/WIKI/FB/data.json?auth_token=i83asDsiWUUyfoypkgMz"

导入 Quandl 数据:

quandl_data <- fromJSON(quandl_url)

列表类型的quandl_data

quandl_data

【讨论】:

    【解决方案2】:

    jsonlite 包会自动获取数据帧:

    library(jsonlite)
    mydata <- fromJSON("http://api.fantasy.nfl.com/v1/players/stats?statType=seasonStats&season=2010&week=1&format=json")
    
    names(mydata$players)
    # [1] "id"                 "esbid"              "gsisPlayerId"       "name"              
    # [5] "position"           "teamAbbr"           "stats"              "seasonPts"         
    # [9] "seasonProjectedPts" "weekPts"            "weekProjectedPts" 
    
    head(mydata$players)
    #        id     esbid gsisPlayerId                name position teamAbbr stats.1
    # 1  100029     FALSE        FALSE San Francisco 49ers      DEF       SF      16
    # 2     729 ABD660476   00-0025940     Husain Abdullah       DB       KC      15
    # 3 2504171 ABR073003   00-0019546        John Abraham       LB               15
    # 4 2507266 ADA509576   00-0025668       Michael Adams       DB               13
    # 5 2505708 ADA515576   00-0022247          Mike Adams       DB      IND      15
    # 6 1037889 ADA534252   00-0027610       Phillip Adams       DB      ATL      11
    

    您可以使用jsonlite::fromJSON() 中的simplify 参数来控制它。

    【讨论】:

      【解决方案3】:

      RJson 和 Jsonlite 具有类似的命令,例如 fromJSON,但根据您加载它们的顺序,它们会相互覆盖。出于我的目的,rJson 比 JsonLite 更好地构造数据,所以我确保以正确的顺序加载/仅加载 Rjson

      【讨论】:

      • 欢迎来到 Stack Overflow!您的回答似乎更像是评论而不是解决方案。 (我知道新用户无法发布 cmets。)
      【解决方案4】:

      这个 JSON 并没有什么“异常”,只是它不是一个适合数据框的矩形结构。 JSON 可以表示更丰富的数据结构。

      例如(使用rjson 包,你还没有说你用了什么):

      > data = rjson::fromJSON(file="http://api.fantasy.nfl.com/v1/players/stats?statType=seasonStats&season=2010&week=1&format=json")
      > length(data[[4]][[10]]$stats)
      [1] 14
      > length(data[[4]][[1]]$stats)
      [1] 21
      

      data[[1 to 3]] 看起来像标题)

      data[[4]] 的第 10 个元素的“stats”有 14 个元素,第一个元素的“stats”有 21 个。这将如何适应矩形数据框? R 将其存储在列表中,因为这是 R 存储不规则数据结构的最佳方式。

      除非您可以定义将不规则数据映射到矩形数据框中的方法,否则您不能将其存储在数据框中。你了解数据的结构吗?这是必不可少的。

      【讨论】:

      • 感谢@Spacedman。听起来问题在于我没有映射 JSON -> 数据帧过程(我不知道必须这样做)。我不知道怎么做,但会调查。谢谢!
      • 你只需要这样做如果 JSON 的结构比一个简单的表更深,它就在这里。在 R 中构建数据的最佳方式(保留为列表,转换为具有链接 ID 的两个数据帧)取决于您想用它做什么。
      猜你喜欢
      • 2014-10-22
      • 1970-01-01
      • 2021-09-27
      • 1970-01-01
      • 2016-07-27
      • 2015-02-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多