How to write to json with children from R

前端 未结 3 571
日久生厌
日久生厌 2020-11-29 23:27

I want to turn an R data.frame into a JSON object in order to use it for preparing data visualizations with d3.js. I found a lot of questions that asked how to get JSON into

相关标签:
3条回答
  • 2020-11-29 23:53

    This is a recursive approach which is cleaner:

    require(RJSONIO)
    
    makeList<-function(x){
      if(ncol(x)>2){
        listSplit<-split(x[-1],x[1],drop=T)
        lapply(names(listSplit),function(y){list(name=y,children=makeList(listSplit[[y]]))})
      }else{
        lapply(seq(nrow(x[1])),function(y){list(name=x[,1][y],Percentage=x[,2][y])})
      }
    }
    
    
    jsonOut<-toJSON(list(name="MyData",children=makeList(MyData[-1])))
    cat(jsonOut)
    
    0 讨论(0)
  • 2020-11-29 23:53

    Using a combination of split and subset may get what you want. For example

    library(RJSONIO)
    list1<-split(subset(MyData,select=c(-Location)),Mydata$Location)
    list2<-lapply(list1,function(x){split(subset(x,select=c(-Station)),x$Station,drop=TRUE)})
    list3<-lapply(list2,function(x){lapply(x,function(y){split(subset(y,select=c(-Size,-ID)),y$Size,drop=TRUE)})})
    jsonOut<-toJSON(list(MyData=list3))
    jsonOut1<-gsub('([^\n]*?): \\{\n "Percentage"','\\{"name":\\1,"Percentage"',jsonOut)
    jsonOut2<-gsub('"([^"]*?)": \\{','"name":"\\1","children":\\{',jsonOut1)
    
    cat(jsonOut2)
    {
     "name":"MyData","children":{
     "name":"Alpha","children":{
     "name":"Yota","children":{
    {"name": "Big","Percentage":   0.85 
    },
    {"name":"Medium","Percentage":   0.19 
    },
    {"name":"small","Percentage":   0.89 
    } 
    },
    "name":"Zeta","children":{
    {"name": "Big","Percentage":   0.63 
    },
    {"name":"Medium","Percentage":   0.43 
    },
    {"name":"small","Percentage":   0.47 
    } 
    } 
    },
    "name":"Beta","children":{
     "name":"Meta","children":{
    {"name": "Big","Percentage":   0.89 
    },
    {"name":"Medium","Percentage":   0.71 
    },
    {"name":"small","Percentage":   0.59 
    } 
    },
    "name":"Theta","children":{
    {"name": "Big","Percentage":   0.09 
    },
    {"name":"Medium","Percentage":   0.33 
    },
    {"name":"small","Percentage":   0.79 
    } 
    } 
    } 
    } 
    }
    
    0 讨论(0)
  • 2020-11-30 00:15

    I am pigging backing off of user1609452's answer and answering the question about non regular file hierarchies. If you have a column where some data have children and some do not, use the following:

    makeList<-function(x){ 
    if(ncol(x)>2){
        listSplit<-split(x[-1],x[1],drop=T)
        lapply(names(listSplit),function(y){
            if(as.character(listSplit[[y]][1,1]) > 0){
                list(name=y,children=makeList(listSplit[[y]]))
            } else {
                list(name=y,size=listSplit[[y]][1,2])
            }
            })
    }else{
        lapply(seq(nrow(x[1])),function(y){list(name=x[,1][y],size=x[,2][y])})
    }
    }
    

    Basically we check if the current row has more children or if it simply needs to have size appended to it.

    0 讨论(0)
提交回复
热议问题