繁体   English   中英

R data.frame到带有子节点/分层结构的JSON

[英]R data.frame to JSON with child nodes / hierarchical

我正在尝试将R中的data.frame写入JSON文件,但是要在其中具有子节点的层次结构中进行。 我找到了示例和JSONIO,但无法将其应用于我的案例。

这是R中的data.frame

> DF
   Date_by_Month    CCG Year Month refYear      name OC_5a OC_5b OC_5c 
1     2010-01-01 MyTown 2010    01    2009 2009/2010     0    15    27 
2     2010-02-01 MyTown 2010    02    2009 2009/2010     1    14    22 
3     2010-03-01 MyTown 2010    03    2009 2009/2010     1     6    10 
4     2010-04-01 MyTown 2010    04    2010 2010/2011     0    10    10 
5     2010-05-01 MyTown 2010    05    2010 2010/2011     1    16     7 
6     2010-06-01 MyTown 2010    06    2010 2010/2011     0    13    25 

除了按月写入数据外,我还想创建一个汇总子级,即“每年”,该子级包含(例如)今年所有月份的总和。 这就是我希望JSON文件的样子:

[
    {
     "ccg":"MyTown",
     "data":[
            {"period":"yearly",
             "scores":[
                {"name":"2009/2010","refYear":"2009","OC_5a":2, "OC_5b": 35, "OC_5c": 59},
                {"name":"2010/2011","refYear":"2010","OC_5a":1, "OC_5b": 39, "OC_5c": 42},
             ]
             },
            {"period":"monthly",
             "scores":[
                {"name":"2009/2010","refYear":"2009","month":"01","year":"2010","OC_5a":0, "OC_5b": 15, "OC_5c": 27},
                {"name":"2009/2010","refYear":"2009","month":"02","year":"2010","OC_5a":1, "OC_5b": 14, "OC_5c": 22},
                {"name":"2009/2010","refYear":"2009","month":"03","year":"2010","OC_5a":1, "OC_5b": 6, "OC_5c": 10},
                {"name":"2009/2010","refYear":"2009","month":"04","year":"2010","OC_5a":0, "OC_5b": 10, "OC_5c": 10},
                {"name":"2009/2010","refYear":"2009","month":"05","year":"2010","OC_5a":1, "OC_5b": 16, "OC_5c": 7},
                {"name":"2009/2010","refYear":"2009","month":"01","year":"2010","OC_5a":0, "OC_5b": 13, "OC_5c": 25}
                ]
             }
            ]
    },
]

非常感谢你的帮助!

扩展我的评论:

jsonlite包具有很多功能,但是您要描述的内容实际上不再映射到数据框,因此我怀疑任何固定例程都具有此功能。 最好的选择可能是将数据帧转换为具有与JSON结构完全匹配的结构的更通用列表(FYI数据帧在内部存储为列列表),然后仅使用转换器进行翻译

通常,这很复杂,但是在您的情况下应该相当简单。 该列表的结构将与JSON数据完全相同:

list(
  list(
    ccg = "Town1",
    data = list(
      list(
        period = "yearly",
        scores = yearly_data_frame_town1
      ),
      list(
        period = "monthly",
        scores = monthly_data_frame_town1
      )
    )
  ),
  list(
    ccg = "Town2",
    data = list(
      list(
        period = "yearly",
        scores = yearly_data_frame_town2
      ),
      list(
        period = "monthly",
        scores = monthly_data_frame_town2
      )
    )
  )
)

构造此列表应该是直接遍历unique(DF$CCG)并在每个步骤使用aggregate来构造年度数据的简单案例。

如果需要性能,请查看data.tabledplyr软件包以一次执行所有循环和聚合。 前者灵活而高效,但有些深奥。 后者具有相对简单的语法,并且具有类似的性能,但是它是专门为构建数据帧管道而设计的,因此可能需要花点时间才能使它生成正确的输出格式。

看起来ssdecontrol已为您覆盖...但这是我的解决方案。 需要遍历唯一的CCG和Years以创建整个数据集...

df <- read.table(textConnection("Date_by_Month    CCG Year Month refYear      name OC_5a OC_5b OC_5c 
2010-01-01 MyTown 2010    01    2009 2009/2010     0    15    27 
2010-02-01 MyTown 2010    02    2009 2009/2010     1    14    22 
2010-03-01 MyTown 2010    03    2009 2009/2010     1     6    10 
2010-04-01 MyTown 2010    04    2010 2010/2011     0    10    10 
2010-05-01 MyTown 2010    05    2010 2010/2011     1    16     7 
2010-06-01 MyTown 2010    06    2010 2010/2011     0    13    25"), stringsAsFactors=F, header=T)


library(RJSONIO)
to_list <- function(ccg, year){
  df_monthly <- subset(df, CCG==ccg & Year==year)
  df_yearly <- aggregate(df[,c("OC_5a", "OC_5b", "OC_5c")] ,df[,c("name", "refYear")], sum)
  l <- list("ccg"=ccg, 
            data=list(list("period" = "yearly",
                      "scores" = as.list(df_yearly)
                      ),
                      list("period" = "monthly",
                           "scores" = as.list(df[,c("name", "refYear", "OC_5a", "OC_5b", "OC_5c")])
                      )
            )
       )
  return(l)
}
toJSON(to_list("MyTown", "2010"), pretty=T)

哪个返回:

{
    "ccg" : "MyTown",
    "data" : [
        {
            "period" : "yearly",
            "scores" : {
                "name" : [
                    "2009/2010",
                    "2010/2011"
                ],
                "refYear" : [
                    2009,
                    2010
                ],
                "OC_5a" : [
                    2,
                    1
                ],
                "OC_5b" : [
                    35,
                    39
                ],
                "OC_5c" : [
                    59,
                    42
                ]
            }
        },
        {
            "period" : "monthly",
            "scores" : {
                "name" : [
                    "2009/2010",
                    "2009/2010",
                    "2009/2010",
                    "2010/2011",
                    "2010/2011",
                    "2010/2011"
                ],
                "refYear" : [
                    2009,
                    2009,
                    2009,
                    2010,
                    2010,
                    2010
                ],
                "OC_5a" : [
                    0,
                    1,
                    1,
                    0,
                    1,
                    0
                ],
                "OC_5b" : [
                    15,
                    14,
                    6,
                    10,
                    16,
                    13
                ],
                "OC_5c" : [
                    27,
                    22,
                    10,
                    10,
                    7,
                    25
                ]
            }
        }
    ]
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM