【问题标题】:Convert R data.frame to multilevel JSON将 R data.frame 转换为多级 JSON
【发布时间】:2015-11-26 19:02:28
【问题描述】:

我在 R 中有一个周期性的过程,它产生了一个 data.frame。 我想用这个 data.frame 用 AngularJS 创建一个下拉选择器。

我的最终 data.frame 或多或少如下所示(我的真实示例可能具有更深的层次结构):

DF<-data.frame(hie1=c(rep("Cl1",2),"Cl2"),hie2=c("Cl1op1","Cl1op2","Clop1"),
               hie3=c("/first.html","/second.html","/third.html"))

我需要将该 data.frame 转换为具有以下结构的 JSON:

{
"Cl1":{"Cl1op1":"/first.html","Cl1op2": "/second.html"},
"Cl2":{"Cl2op1":"/third.html"}
}

到目前为止,我已经尝试了带有和不带有列名的 data.frame 的 rjsonRJSONIO 包的所有 toJSON 命令:

library(rjson)
#library(RJSONIO)

DF2<-DF
colnames(DF2)<-NULL

cat(toJSON(DF))
cat(toJSON(DF2))

在使用toJSON之前考虑过使用reshape2的dcast函数,但是不知道需要什么样的结构来实现我的目标。

我还使用了 rCharts 中的函数 toJSON2toJSONArray,但没有成功。

R 中是否有适当的转换来获得我正在寻找的输出?

附: (我不介意用 [] 代替 {})

编辑:

我创建了几个函数(如下所示)来满足我的需求。 但是,它们并不太干净,我相信在 R 中必须有更好的方法来执行这种转换。

我保持这个问题的开放性期待更好的解决方案。

linktwo<-function(V){
  paste0(sapply(V,function(x) paste0("'",toString(x),"'")),collapse=":")
}

pastehier<-function(DF){
  if(ncol(DF)==2){
    return(paste0(apply(DF,1,linktwo),collapse=","))
  }else{
    u<-unique(DF[,1])
    output=character()
    for(i in u){
      output<-append(output,paste0(paste0("'",i,"'"),":{",pastehier(DF[DF[,1]==i,-1]),
                           "}"))
    }
    return(paste0(output,collapse=","))
  }
}

pastehier(DF)

【问题讨论】:

    标签: json r reshape2 rjson rjsonio


    【解决方案1】:

    我不完全理解您的要求,也许我的解决方案没用,但这里是一个尝试:

    library(reshape2)
        prova <- dcast(DF, hie1 ~ ... )
         toJSON(prova, pretty = TRUE)
        [
          {
            "hie1": "Cl1",
            "Cl1op1": "/first.html",
            "Cl1op2": "/second.html"
          },
          {
            "hie1": "Cl2",
            "Clop1": "/third.html"
          }
        ] 
    

    地点:

    > prova
      hie1      Cl1op1       Cl1op2       Clop1
    1  Cl1 /first.html /second.html        <NA>
    2  Cl2        <NA>         <NA> /third.html
    

    【讨论】:

    • 我的目标是实现我在第二个块中写的输出。我从具有 i 1 级层次结构、j_i 2 级层次结构、k_{ji} 3 级层次结构等的 data.frame 开始。坚持示例层次结构是 (i=2,j_1=2,j_2=1,k_ij= 1 对于所有 ij),我想将其转换为 {level1_1:{level2_1:level3_11,level2_2:level_3_12},level1_2:{...}}。我试图以一种简单的方式陈述这个问题,但并不是那么简单:(感谢任何编辑帮助。
    猜你喜欢
    • 1970-01-01
    • 2017-06-26
    • 1970-01-01
    • 2017-01-05
    • 2016-04-08
    • 2017-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多