Advertisement
celestialgod

rearrange json

May 26th, 2015
627
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
R 1.98 KB | None | 0 0
  1. library(rjson)
  2. library(magrittr)
  3. library(plyr)
  4. library(dplyr)
  5.  
  6. jsonFile = "[{\"speed\":4,\"dist\":2,\"brand\":\"Audi\"},
  7.  {\"speed\":4,\"dist\":10,\"brand\":\"Benz\"},
  8.  {\"speed\":7,\"dist\":4,\"brand\":\"Audi\"},
  9.  {\"speed\":7,\"dist\":22,\"brand\":\"Benz\"},
  10.  {\"speed\":8,\"dist\":16,\"brand\":\"Benz\"}
  11. ]"
  12.  
  13. tmp = fromJSON(jsonFile) %>% lapply(unlist) %>% Reduce(rbind, .) %>%
  14.   data.frame(stringsAsFactors = FALSE) %>%
  15.   transform(dist = as.numeric(as.character(dist)),
  16.             speed = as.numeric(as.character(speed))) %>%
  17.   arrange(dist)
  18. sink("jsonRearrange.json")
  19. ## toJSON 轉出來的格式不適用,自己嘗試看看
  20. tmp %>% apply(1, function(x){
  21.     x[sapply(x, class) == "character"] %<>% paste0("\"", ., "\"")
  22.     x[sapply(x, class) == "factor"] %<>% paste0("\"", as.character(.), "\"")
  23.     paste0(paste0("\"", names(x), "\":"), x) %>%
  24.       paste(collapse = ",") %>% paste0("{", ., "}")
  25.   }) %>% paste(.,collapse=",\n") %>%
  26.   paste0("[", ., "]") %>% cat()
  27. sink()
  28. ## output:
  29. # [{"speed":4,"dist": 2,"brand":Audi},
  30. # {"speed":7,"dist": 4,"brand":Audi},
  31. # {"speed":4,"dist":10,"brand":Audi},
  32. # {"speed":8,"dist":16,"brand":Audi},
  33. # {"speed":7,"dist":22,"brand":Audi}]
  34.  
  35.  
  36.  
  37. # faster method
  38. library(data.table)
  39. check.numeric <- function(x){
  40.   all(regexpr("^\\d*\\.?\\d*$", as.character(x)) > 0)
  41. }
  42.  
  43. tmp = fromJSON(jsonFile) %>% unlist() %>% cbind(names(.)) %>%
  44.   data.table() %>% setnames(paste0("X", 1:2)) %>%
  45.   plyr:::splitter_d(.(X2)) %>% llply(select, -X2) %>%
  46.   llply(unlist) %>% do.call(cbind, .) %>% data.table()
  47.  
  48. tmp %<>% sapply(check.numeric) %>% which() %>%
  49.   names() %>% paste0(., "=as.numeric(", ., ")") %>%
  50.   {within(tmp, eval(parse(text=.)))} %>% arrange(dist)
  51.  
  52. output_file = tmp %>% mutate(splitter = 1:nrow(.)) %>%
  53.   plyr:::splitter_d(.(splitter)) %>% llply(select, -splitter) %>%
  54.   llply(toJSON) %>% do.call(c, .) %>%
  55.   paste0(collapse = ",\n") %>% paste0("[\n", ., "\n]\n")
  56.  
  57. sink("jsonRearrange.jason")
  58. cat(output_file)
  59. sink()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement