2016-11-17 2 views
1

Ich versuche, ein data.frame in json-Format istR konvertieren data.frame JSon

meine data.frame hat die folgende Struktur

a <- rep(c("Mario", "Luigi"), each = 3) 
b <- sample(34:57, size = length(a)) 
df <- data.frame(a,b) 
> df 
     a b 
1 Mario 43 
2 Mario 34 
3 Mario 36 
4 Luigi 45 
5 Luigi 52 
6 Luigi 35 

Was ich will, konvertieren schaffen so etwas wie dies (bis es schließlich zu einer .json Datei drucken)

[ 
    { 
    "a": "Mario", 
    "b": [43, 34, 36] 
    }, 
    { 
    "a": "Luigi", 
    "b": [45, 52, 35] 
    } 
] 

ich verschiedene Pakete versucht habe json-Format Handhabung aber so ausgefallen weit diese Art von Ausgabe zu erzeugen. Ich am Ende in der Regel mit so etwas wie dieses

[ 
    { 
    "a":"Mario", 
    "b":43 
    }, 
    { 
    "a":"Mario", 
    "b":34 
    }, 
    { 
    "a":"Mario", 
    "b":36 
    }, 
    { 
    "a":"Luigi", 
    "b":45 
    }, 
    { 
    "a":"Luigi", 
    "b":52 
    }, 
    { 
    "a":"Luigi", 
    "b":35 
    } 
] 

Antwort

5

Wenn Sie Nest b als Liste Spalte, es korrekt konvertieren:

library(jsonlite) 

# converts b to nested list column 
df2 <- aggregate(b ~ a, df, list) 

df2 
##  a   b 
## 1 Luigi 49, 42, 37 
## 2 Mario 46, 50, 45 

toJSON(df2, pretty = TRUE) 
## [ 
## { 
##  "a": "Luigi", 
##  "b": [49, 42, 37] 
## }, 
## { 
##  "a": "Mario", 
##  "b": [46, 50, 45] 
## } 
## ] 

oder wenn Sie es vorziehen dplyr:

library(dplyr) 

df %>% group_by(a) %>% 
    summarise(b = list(b)) %>% 
    toJSON(pretty = TRUE) 

oder data.table:

library(data.table) 

toJSON(setDT(df)[, .(b = list(b)), by = a], pretty = TRUE) 

die beide dasselbe zurückgeben.

+0

Dies ist ein besserer Ansatz für dieses Beispiel - glücklich, meine "Zecke" weggenommen zu haben :) – SymbolixAU

+0

Einverstanden, scheint wie der allgemeinere Ansatz! – georg23

2

Um die erforderliche JSON Struktur bekommen Sie Ihre Daten in einer Liste wollen, so etwas wie:

l <- list(list(a = "Mario", 
       b = c(43,34,36)), 
      list(a = "Luigi", 
       b = c(45,52,35))) 

## then can use the library(jsonlite) to convert to JSON 

library(jsonlite) 

toJSON(l, pretty = T) 

[ 
    { 
    "a": ["Mario"], 
    "b": [43, 34, 36] 
    }, 
    { 
    "a": ["Luigi"], 
    "b": [45, 52, 35] 
    } 
] 

So Ihre Daten in diesem Format zu teilen, Sie Dies funktioniert für den einfachen Fall kann

l <- lapply(unique(df$a), function(x) list(a = x, b = df[a == x,"b"]) ) 

## and then the conversion works 
toJSON(l, pretty = T) 

[ 
    { 
    "a": ["Mario"], 
    "b": [44, 49, 50] 
    }, 
    { 
    "a": ["Luigi"], 
    "b": [39, 57, 35] 
    } 
] 

tun, aber wenn es komplexer wird könnte es besser sein, um zu Re-Design, wie Sie Ihre data.frame erstellen, und stattdessen eine Liste erstellen (s) zu beginnen.


Referenz

Die jsonlite vignette ist eine sehr gute Ressource.