将R data.frame转换为多级JSON

时间:2015-11-25 17:39:53

标签: json r reshape2 rjson rjsonio

我在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))

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

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

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

P.S。 (我不介意[]代替{})

编辑:

我已经创建了一些功能(包含在下面)以满足我的需求。 但是,它们并不太干净,我相信必须有更好的方法在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)

1 个答案:

答案 0 :(得分: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