2017-05-04 360 views
1

我想從data.frame格式使用R中的jsonlite包得到一個嵌套的對象數組(JSON)。讓我舉一個例子如何從一個數據框創建一個嵌套的對象數組

library(jsonlite) 
time <- c(1,1,2,2) 
ps <- c("p1","p2","p1","p2") 
v1 <- c(5,6,7,8) 
v2 <- c(10,11,12,13) 
df <- data.frame(ps, v1,v2) 
toJSON(df) 

這裏dfR數據幀和我得到的JSON格式的對象數組:

[{"ps":"p1","v1":5,"v2":10}, 
{"ps":"p2","v1":6,"v2":11}, 
{"ps":"p1","v1":7,"v2":12}, 
{"ps":"p2","v1":8,"v2":13}] 

不過,我想實現下面的輸出,其中基本上我有一個嵌套的結構。添加類似的另一組參數(時間)在這裏,df以長格式看起來像

df2 <- data.frame(time,ps, v1,v2) 

這是

df2 
    time ps v1 v2 
1 1 p1 5 10 
2 1 p2 6 11 
3 2 p1 7 12 
4 2 p2 8 13 

我的最終輸出我想實現(以JSON)格式

[{ 
    "time": "1" 
    "all_ps":[ 
    { 
     "ps":"p1", 
     "v1":5, 
     "v2":10  
    }, 
    { 
     "ps":"p2", 
     "v1":6, 
     "v2":11 
    }] 
    }, 
    { 
    "time": "2" 
    "all_ps":[ 
    { 
    "ps":"p1", 
    "v1":5, 
    "v2":10  
    }, 
    { 
    "ps":"p2", 
    "v1":6, 
    "v2":11 
    }] 
    } 
] 

其中all_ps就像一個額外的結構或分組。給出了這個all_ps,但是我不知道如何將它添加到數據幀中以獲得所需的輸出。如何使用jsonlite在R中實現此目的?

回答

1

分裂數據幀的另一種方式,而不知道在time列的內容:

library(jsonlite) 
ansLs <- lapply(split(df2, df2$time), 
    function(x) list(time=as.character(x$time[1]), all_ps=x[-1])) 
toJSON(unname(ansLs), auto_unbox = TRUE) 
+0

我可以問你我怎麼可以調整,使得數字代碼調用toJson之後值不會用雙引號引起來?即「v2」:11而不是「v2」:「11」 – math

+0

目前無權訪問R。 data.frame是否已經在正確的數據類型中?如果已經存在,您可能需要明確構建您的all_ps。 – chinsoon12

1

這工作:

library(magrittr) 
library(jsonlite) 
lapply(as.list(1:2), function(x) list(time = as.character(x), 
             "all_ps" = df[time == x, ])) %>% 
    toJSON(auto_unbox = TRUE) 
相關問題