2017-05-14 50 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