我有 csv文件,其中一列是 json格式。
json格式的特定列如下所示:
{"title":" ","body":" ","url":"thedailygreen print this healthy eating eat safe Dirty Dozen Foods page all"}
我在R中使用read.csv读取了这个文件。现在,我如何从这个列创建一个新的数据框,其中的字段名称应该是title,body和url。
答案 0 :(得分:6)
您可以使用包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
N.B。 : 上面的代码假设所有单元格仅包含title,body和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)) }))