我在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的rjson
和RJSONIO
包的所有toJSON命令:
library(rjson)
#library(RJSONIO)
DF2<-DF
colnames(DF2)<-NULL
cat(toJSON(DF))
cat(toJSON(DF2))
我在考虑使用reshape2
之前使用了dcast函数,但我不知道实现目标需要什么样的结构。
我还使用了来自rCharts的toJSON2
和toJSONArray
函数,但没有成功。
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)
答案 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