0

我在 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.framerjson和包的所有 toJSON 命令:RJSONIO

library(rjson)
#library(RJSONIO)

DF2<-DF
colnames(DF2)<-NULL

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

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

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

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

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

编辑:

我创建了几个函数(包括在下面)来满足我的需求。但是,它们并不太干净,我相信在 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)
4

1 回答 1

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
于 2015-11-25T17:47:57.717 回答