【问题标题】:converting a column in json format into a new data frame将 json 格式的列转换为新的数据框
【发布时间】:2014-10-12 12:17:55
【问题描述】:

我有一个 csv 文件,其中一列是 json 格式

json 格式的特定列如下所示:

{"title":" ","body":" ","url":"thedailygreen print this healthy eating eat safe Dirty Dozen Foods page all"}

我已经在 R 中使用 read.csv 读取了这个文件。现在,如何从该列创建一个新的数据框,该数据框的字段名称应为标题、正文和 url。

【问题讨论】:

    标签: json r


    【解决方案1】:

    您可以使用包 RJSONIO 来解析列值,例如:

    library(RJSONIO)
    
    # create an example data.frame with a json column
    cell1 <- '{"title":"A","body":"X","url":"http://url1.x"}'
    cell2 <- '{"title":"B","body":"Y","url":"http://url2.y"}'
    cell3 <- '{"title":"C","body":"Z","url":"http://url3.z"}'
    
    df <- data.frame(jsoncol = c(cell1,cell2,cell3),stringsAsFactors=F)
    
    # parse json and create a data.frame
    res <- do.call(rbind.data.frame,
                   lapply(df$jsoncol, FUN=function(x){ as.list(fromJSON(x))}))
    
    > res
       title body           url
         A    X   http://url1.x
         B    Y   http://url2.y
         C    Z   http://url3.z
    

    注意: 上面的代码假定所有单元格仅包含标题、正文和 url。如果 json 单元格中可以有其他属性,请改用此代码:

    vals <- lapply(df$jsoncol,fromJSON)
    res <- do.call(rbind, lapply(vals,FUN=function(v){ data.frame(title=v['title'],
                                                                  body =v['body'],
                                                                  url  =v['url']) }))
    

    编辑(根据评论):

    我已使用以下代码阅读了该文件:

    df <- read.table(file="c:\\sample.tsv", 
                     header=T, sep="\t", colClasses="character")
    

    然后使用此代码进行解析:

    # define a simple function to turn NULL to NA
    naIfnull <- function(x){if(!is.null(x)) x else NA}
    
    vals <- lapply(df$boilerplate,fromJSON)
    res <- do.call(rbind, 
                   lapply(vals,FUN=function(v){ v <- as.list(v)
                                                data.frame(title=naIfnull(v$title),
                                                           body =naIfnull(v$body),
                                                           url  =naIfnull(v$url)) }))
    

    【讨论】:

    • 我的代码是"res
    • @user3928988:抱歉,我无法从该链接下载,因为我没有帐户。您不能发布重现问题的 data.frame 示例吗?
    • 有什么办法可以将实际文件发送给您。因为有很多方法可以读取 read.csv 和 read.table 等文件。我相信问题始于那个
    • 文件在以下链接中:ge.tt/8o9VAdr1/v/0?c 查找 3 列,列名:样板
    • 我尝试使用上面的代码,但我不断收到:错误:参数“txt”必须是 JSON 字符串、URL 或现有文件的路径。我的文字是: {"accuracy":41.394,"altitude":0.0,"bearing":0.0,"elapsedRealtimeNanos":306176061264038,"extras":null,"latitude":46.7941727,"longitude":23.6628978,"provider" :"fused","speed":0.0,"time":1420711490869,"complete":true,"fromMockProvider":false}
    猜你喜欢
    • 2021-08-21
    • 1970-01-01
    • 2014-01-23
    • 1970-01-01
    • 2021-10-05
    • 2016-08-05
    • 1970-01-01
    • 1970-01-01
    • 2021-07-04
    相关资源
    最近更新 更多