2017-05-14 45 views
1

我有一个也包含JSON的CSV文件。我想把公司,类型,驱动程序放到一个数据框中 我不想解析它,因为下面的CSV只是一个示例,我有更多的列与各种json键/值(有些不在,不在一个特定的顺序,以及它们的很多很多)。建议在CSV文件中读取JSON而不在R中解析

我的子short_csvjson.csv CSV文件示例:

Married,Transportation,Color 
YES,"{""Company"":""GTS"",""Type"":""Limo""}",White 
,"{""Driver"":""John""}",Green 
NO,"{""Type"":""Van"",""Driver"":""John""}", 

我能做些什么(外解析),以与

my_data$Married 
my_data$Transportation.Company 
my_data$Transportation.Type 
my_data$Transportation.Driver 
my_data$Color 

感谢

+0

为什么你这么反对解析? – hrbrmstr

+0

@hrbrmstr我只是不认为解析是一个有效的方法。我大概有30名不同的JSON对象,他们的键/值是不同的顺序等 – user8010356

回答

1

这里有一个数据帧我可以想到的解决方案可以让你得到你所需要的包装和逐行处理:

承担df看起来像这样利用read.csvstringsAsFactors = FALSE

df 
    Married     Transportation Color 
1  YES {"Company":"GTS","Type":"Limo"} White 
2      {"Driver":"John"} Green 
3  NO {"Type":"Van","Driver":"John"}  

你可以这样做:

library(jsonlite) 

l <- lapply(df$Transportation, fromJSON) 
n <- unique(unlist(sapply(l, names))) 
df[, n] <- lapply(n, function(x) sapply(l, function(y) y[[x]])) 

为了得到这个:

如果
df 
    Married     Transportation Color Company Type Driver 
1  YES {"Company":"GTS","Type":"Limo"} White  GTS Limo NULL 
2      {"Driver":"John"} Green NULL NULL John 
3  NO {"Type":"Van","Driver":"John"}   NULL Van John 

不知道还有一个更高效办法。

EDIT基于添加的信息涉及畸形JSON在实际数据中

在情况下,存在在Transportation列中的原始格式不正确的JSON,这里是解决它的一种方法:

原始数据帧如下:

df <- read.table(text = 'Married,Transportation,Color 
YES,"{""Company"":""GTS"",""Type"":""Limo""}",White 
,"{""Driver"":""John""}",Green 
NO,"{""Type"":""Van"",""Driver"":""John""}",', 
header = TRUE, sep = ',', stringsAsFactors = FALSE) 

行结合和额外的行与畸形JSON一个额外的““”字符:

df <- rbind(df, data.frame(Married = 'NO', 
          Transportation = '{"Company": ""GTLS"}', 
          Color = 'Red')) 

新的df看起来是这样的(见第4行畸形的JSON):

Married     Transportation Color 
1  YES {"Company":"GTS","Type":"Limo"} White 
2      {"Driver":"John"} Green 
3  NO {"Type":"Van","Driver":"John"}  
4  NO   {"Company": ""GTLS"} Red 

现在,用这个来获取所有嵌套的JSON为单独列:

l <- lapply(df$Transportation, function(x) tryCatch({fromJSON(x)}, error = function(e) NA)) 
n <- unique(unlist(sapply(l, names))) 
df[, n] <- lapply(n, function(x) 
        sapply(l, function(y) 
          if (!is.null(names(y))) y[[x]])) 

输出作为如下:

Married     Transportation Color Company Type Driver 
1  YES {"Company":"GTS","Type":"Limo"} White  GTS Limo NULL 
2      {"Driver":"John"} Green NULL NULL John 
3  NO {"Type":"Van","Driver":"John"}   NULL Van John 
4  NO   {"Company": ""GTLS"} Red NULL NULL NULL 
+0

@Gopala嗨,我得到EOF错误运行 →<后 - lapply(DF $运输,fromJSON) 错误:解析错误:提前EOF (在这里)------^ – user8010356

+0

你能看到'str(df $ Transportation)'是什么吗?另外,您可能没有在原始数据中正确构建JSON。你可以修改这个函数来捕获这个错误,并为这些值返回NA,例如'lapply(df $ Transportation,function(x)tryCatch({fromJSON(x)},error = function(e)NA)) '。 – Gopala

+0

当我运行str时,我得到一个字符,例如 'chr [1:48]“{\”Company \“:\”GTS \“,\”Type \“:\”Limo \“,\”Driver \“:\”John \“}”...' 我也修改了函数,但是当我到达 'df [,n] < - lapply(n,function(x)sapply(l,函数(y)y [[x]]))' 我收到了:'y [[x]]:下标越界出错' – user8010356