2017-01-11 3 views
1

У меня есть кадр данных R в моем проекте, который я хотел бы преобразовать в формат json.R кадр данных в пользовательский формат json

Мой фрейм данных "df_sales":

df_sales 
     2 4  5  7  8   9  10  11  12 
2004 40400 0 226100 238556.4 217044.8 2243085.4 118754.50 193740 181075 
2005  0 0  0  0.0 60000.0  0.0  0.00  0  0 
2006  0 0  0  0.0  0.0  0.0  4.75  0  0 
2007  0 8100  0 162400.0 1500.0 181860.9 450.00  0 73100 
2008  0 0  0  0.0 10000.0 1000.0  0.00  0  0 

И мой dput выход из моих df_sales данных кадра:

dput(df_sales) 
structure(list(`2` = c(40400, 0, 0, 0, 0), `4` = c(0, 0, 0, 8100, 
0), `5` = c(226100, 0, 0, 0, 0), `7` = c(238556.35, 0, 0, 162400, 
0), `8` = c(217044.75, 60000, 0, 1500, 10000), `9` = c(2243085.4, 
0, 0, 181860.85, 1000), `10` = c(118754.5, 0, 4.75, 450, 0), 
    `11` = c(193740, 0, 0, 0, 0), `12` = c(181075, 0, 0, 73100, 
    0)), .Names = c("2", "4", "5", "7", "8", "9", "10", "11", 
"12"), row.names = c("2004", "2005", "2006", "2007", "2008"), class = "data.frame") 

Я хотел бы преобразовать мой кадр df_sales данных обряду json format:

{ 
    "series":[ 
     { 
     "year":"2004", 
     "month":{ 
      "2":40400, 
      "4":0, 
      "5":226100, 
      "7":238556.35, 
      "8":217044.75, 
      "9":2243085.4, 
      "10":118754.5, 
      "11":193740, 
      "12":181075 
     } 
     }, 
     { 
     "year":"2005", 
     "month":{ 
      "2":0, 
      "4":0, 
      "5":0, 
      "7":0, 
      "8":60000, 
      "9":0, 
      "10":0, 
      "11":0, 
      "12":0 
     } 
     }, 
     { 
     "year":"2006", 
     "month":{ 
      "2":0, 
      "4":0, 
      "5":0, 
      "7":0, 
      "8":0, 
      "9":0, 
      "10":4.75, 
      "11":0, 
      "12":0 
     } 
     }, 
     { 
     "year":"2007", 
     "month":{ 
      "2":0, 
      "4":8100, 
      "5":0, 
      "7":162400, 
      "8":1500, 
      "9":181860.85, 
      "10":450, 
      "11":0, 
      "12":73100 
     } 
     }, 
     { 
     "year":"2008", 
     "month":{ 
      "2":0, 
      "4":0, 
      "5":0, 
      "7":0, 
      "8":10000, 
      "9":1000, 
      "10":0, 
      "11":0, 
      "12":0 
     } 
     } 
    ] 
} 

Я использую jsonlite package и rjson для преобразования моих «df_sales», но я не могу получить эту структуру с этими пакетами.

Я попытался с помощью R применить(), lapply() и sapply() функции, чтобы получить мой собственный JSON:

toJSON(list(series=list(df_sales),MARGIN=1,FUN=function(r){ 
sapply(r,FUN=function(i){list(i)}) 
}))), pretty = TRUE, auto_unbox = TRUE) 

, но я просто получить этот результат:

{ 
    "series": [ 
    { 
     "2004": { 
     "2": 40400, 
     "4": 0, 
     "5": 226100, 
     "7": 238556.35, 
     "8": 217044.75, 
     "9": 2243085.4, 
     "10": 118754.5, 
     "11": 193740, 
     "12": 181075 
     }, 
     "2005": { 
     "2": 0, 
     "4": 0, 
     "5": 0, 
     "7": 0, 
     "8": 60000, 
     "9": 0, 
     "10": 0, 
     "11": 0, 
     "12": 0 
     }, 
     "2006": { 
     "2": 0, 
     "4": 0, 
     "5": 0, 
     "7": 0, 
     "8": 0, 
     "9": 0, 
     "10": 4.75, 
     "11": 0, 
     "12": 0 
     }, 
     "2007": { 
     "2": 0, 
     "4": 8100, 
     "5": 0, 
     "7": 162400, 
     "8": 1500, 
     "9": 181860.85, 
     "10": 450, 
     "11": 0, 
     "12": 73100 
     }, 
     "2008": { 
     "2": 0, 
     "4": 0, 
     "5": 0, 
     "7": 0, 
     "8": 10000, 
     "9": 1000, 
     "10": 0, 
     "11": 0, 
     "12": 0 
     } 
    } 
    ] 
} 

ли вы, есть какие-либо советы или любое другое решение?

спасибо.

+0

Если вы можете дать выход 'dput' на фоторамке данных это сэкономит нам приходится реконструировать его, мы можем просто вставить' dput' выход в. – Spacedman

+0

Я уверен, что ваш желаемый результат ISN Действительный JSON. У вас есть некоторые опечатки (отсутствует «' 'в конце каждого года), но более серьезно у вас есть повторяющиеся ключи,' 'year '' и '' month "' оба повторяются как имена ключей, а это не разрешено. Выход, который вы получаете *, является * действительным JSON, но я думаю, что у вас будет немного грубого времени, модифицирующего 'jsonlite', чтобы создать незаконный результат, как вы хотите. – Gregor

+0

Спасибо, я пропустил свою копию/вставку. просто изменил пользовательский формат json в моем сообщении. – aborderon

ответ

0

Вот один из способов сделать это:

toJSON(
    list(
    series = 
     lapply(row.names(df_sales), function(x) { 
     list(
      year = x, 
      month = as.list(df_sales[x,]) 
     ) 
     })  
), 
    auto_unbox = TRUE, 
    pretty = TRUE 
) 

Примечание:

  • чтения год от row.names
  • каждая строка преобразуется в список
  • с помощью опции auto_unbox

Результаты:

{ 
    "series": [ 
    { 
     "year": "2004", 
     "month": { 
     "2": 40400, 
     "4": 0, 
     "5": 226100, 
     "7": 238556.35, 
     "8": 217044.75, 
     "9": 2243085.4, 
     "10": 118754.5, 
     "11": 193740, 
     "12": 181075 
     } 
    }, 
    { 
     "year": "2005", 
     "month": { 
     "2": 0, 
     "4": 0, 
     "5": 0, 
     "7": 0, 
     "8": 60000, 
     "9": 0, 
     "10": 0, 
     "11": 0, 
     "12": 0 
     } 
    }, 
    { 
     "year": "2006", 
     "month": { 
     "2": 0, 
     "4": 0, 
     "5": 0, 
     "7": 0, 
     "8": 0, 
     "9": 0, 
     "10": 4.75, 
     "11": 0, 
     "12": 0 
     } 
    }, 
    { 
     "year": "2007", 
     "month": { 
     "2": 0, 
     "4": 8100, 
     "5": 0, 
     "7": 162400, 
     "8": 1500, 
     "9": 181860.85, 
     "10": 450, 
     "11": 0, 
     "12": 73100 
     } 
    }, 
    { 
     "year": "2008", 
     "month": { 
     "2": 0, 
     "4": 0, 
     "5": 0, 
     "7": 0, 
     "8": 10000, 
     "9": 1000, 
     "10": 0, 
     "11": 0, 
     "12": 0 
     } 
    } 
    ] 
} 
Смежные вопросы