2017-04-06 24 views
1

data.frame我有以下代碼,其中從JSON文件中提取數據。「嵌入」從JSON

library(jsonlite) 

file_path <- 'C:/some/file/path.json' 

df <- jsonlite::fromJSON(txt = file_path , 
         simplifyVector = FALSE, 
         simplifyDataFrame = TRUE, 
         simplifyMatrix = FALSE, 
         flatten = FALSE) 

數據結構是高度嵌套的。我的方法提取99%的它只是罰款,但在數據的一個特定部分我碰到,我會形容爲「嵌入式」的數據幀的現象傳來:

df <- structure(
    list(
    ID = c(1L, 2L, 3L, 4L, 5L), 
    var1 = c('a', 'b', 'c', 'd', 'e'), 
    var2 = structure(
     list(
     var2a = c('v', 'w', 'x', 'y', 'z'), 
     var2b = c('vv', 'ww', 'xx', 'yy', 'zz')), 
     .Names = c('var2a', 'var2b'), 
     row.names = c(NA, 5L), 
     class = 'data.frame'), 
    var3 = c('aa', 'bb', 'cc', 'dd', 'ee')), 
    .Names = c('ID', 'var1', 'var2', 'var3'), 
    row.names = c(NA, 5L), 
    class = 'data.frame') 

# Looks like this: 
# ID var1 var2.var2a var2.var2b var3 
# 1 1 a   v   vv aa 
# 2 2 b   w   ww bb 
# 3 3 c   x   xx cc 
# 4 4 d   y   yy dd 
# 5 5 e   z   zz ee 

看起來像一個正常的數據框架,它的行爲就像大部分。

class(df) 
# [1] "data.frame" 

df[1,] 
# ID var1 var2.var2a var2.var2b var3 
# 1  a   v   vv aa 

dim(df) 
# [1] 5 4 
# One less than expected due to embedded data frame 

lapply(df, class) 
# $ID 
# [1] "integer" 
# 
# $var1 
# [1] "character" 
# 
# $var2 
# [1] "data.frame" 
# 
# $var3 
# [1] "character" 

str(df) 
# 'data.frame': 5 obs. of 4 variables: 
# $ ID : int 1 2 3 4 5 
# $ var1: chr "a" "b" "c" "d" ... 
# $ var2:'data.frame': 5 obs. of 2 variables: 
# ..$ var2a: chr "v" "w" "x" "y" ... 
# ..$ var2b: chr "vv" "ww" "xx" "yy" ... 
# $ var3: chr "aa" "bb" "cc" "dd" ... 

這到底是怎麼回事,爲什麼jsonlite創造這個奇怪的結構,而不是隻是一個簡單的data.frame?我可以避免這種行爲嗎?如果不是,我該如何最優雅地糾正這一點?我已經使用了下面的方法,但最好還是覺得非常黑客。

# Any columns with embedded data frame? 
newX <- X[,-which(lapply(X, class) == 'data.frame')] %>% 
    # Append them to the end 
    cbind(X[,which(lapply(X, class) == 'data.frame')]) 

更新

建議的解決方案解決了我的問題,但我仍然覺得我不懂的怪嵌入式data.frame結構。我會認爲這樣的結構在R數據格式慣例中是非法的,或者至少在使用[的子集方面表現不同。我已經打開了一個separate question

回答

1

我想你想你的扁平化DF對象:

json <- toJSON(df) 
flat_df <- fromJSON(json, flatten = T) 

str(flat_df) 

'data.frame': 5 obs. of 5 variables: 
$ ID  : int 1 2 3 4 5 
$ var1  : chr "a" "b" "c" "d" ... 
$ var3  : chr "aa" "bb" "cc" "dd" ... 
$ var2.var2a: chr "v" "w" "x" "y" ... 
$ var2.var2b: chr "vv" "ww" "xx" "yy" ... 

那是更接近你在找什麼?

+0

是的,謝謝,能解決問題,使我的哈克解決方法是多餘的。但是,我想知道更多關於究竟發生了什麼的細節。對於初學者來說,什麼叫這個數據結構?它並不是真正的嵌套。 – JanLauGe

+1

jsonlite正在將json數組簡化爲一個嵌套的數據框。你可以通過說'simplyDataFrame = F'來關閉它,但是它會返回嵌套列表。很難說,沒有json文本對象的工作,但它似乎嵌套;) –

+0

謝謝!看到我的更新後續行動:) – JanLauGe