使用tidyjson和R进行简单格式化

使用tidyjson和R进行简单格式化,json,r,jsonlite,Json,R,Jsonlite,我有一个简单的JSON文件,我正试图将其强制转换为R data.frame json = " { \"objects\": { \"object_one\": { \"key1\" : \"value1\", \"key2\" : \"value2\", \"key3\" : \"0\", \"key4\" : \"value3\", \"key5\" :

我有一个简单的JSON文件,我正试图将其强制转换为R data.frame

json = "
{ \"objects\":
  {
    \"object_one\": {
      \"key1\"        : \"value1\",
      \"key2\"        : \"value2\",
      \"key3\"        : \"0\",
      \"key4\"        : \"value3\",
      \"key5\"        : \"False\",
      \"key6\"        : \"False\"
    },

    \"object_two\": {
      \"key1\"        : \"0.5\",
      \"key2\"        : \"0\",
      \"key3\"        : \"343\",
      \"key4\"        : \"value4\",
      \"key5\"        : \"True\",
      \"key6\"        : \"True\"
    }
  }
}
"
我只想将每个对象的名称提取为索引键(或rowname),从键中创建列名,并分散值

不幸的是,我没有幸运地解开语法。有人能帮忙吗

谢谢


Stuart

不能完全确定所需的输出,但可以使用
jsonlite::fromJSON
提取数据,并使用
data.table::rbindlist
将其放入
数据表中

library(jsonlite)
library(data.table)

rbindlist(fromJSON(json))

#     object_one object_two
# 1:     value1        0.5
# 2:     value2          0
# 3:          0        343
# 4:     value3     value4
# 5:      False       True
# 6:      False       True

根据您的评论,另一种方法涉及一些重塑

library(jsonlite)
library(reshape2)

lst <- fromJSON(json)
lst <- lapply(lst[[1]], unlist)

df <- as.data.frame(lst)
df$key <- rownames(df)

df <- melt(df, id = "key")
df <- dcast(df, formula = variable ~ key)
df
#      variable   key1   key2 key3   key4  key5  key6
# 1 object_one value1 value2    0 value3 False False
# 2 object_two    0.5      0  343 value4  True  True
library(jsonlite)
图书馆(E2)

lst使用tidyjson有两种方法,第一种是使用
tidyjson::append_values\u string
,然后使用
tidyr::spread

library(tidyjson)
library(dplyr)
library(tidyr)
json %>% 
  enter_object("objects") %>% 
  gather_keys("object") %>% 
  gather_keys("key") %>% 
  append_values_string("value") %>% 
  tbl_df %>% spread(key, value)

#> # A tibble: 2 x 8
#>   document.id     object   key1   key2  key3   key4  key5  key6
#> *       <int>      <chr>  <chr>  <chr> <chr>  <chr> <chr> <chr>
#> 1           1 object_one value1 value2     0 value3 False False
#> 2           1 object_two    0.5      0   343 value4  True  True    

第二种方法的优点是,您可以(a)指定每列的类型,并且(b)即使某些文档或对象中的键发生更改(或丢失),也可以保证获得相同的data.frame结构。

理想情况下,我希望格式为colnames=c(“key1”、“key2”、“keyn”…)的数据帧,行名为c(“一号物体”、“二号物体”等
json %>%
  enter_object("objects") %>%
  gather_keys("object") %>%
  spread_values(
    key1 = jstring("key1"),
    key2 = jstring("key2"),
    key3 = jnumber("key3"),
    key4 = jstring("key4"),
    key5 = jstring("key5"),
    key6 = jstring("key6")
  )

#>   document.id     object   key1   key2 key3   key4  key5  key6
#> 1           1 object_one value1 value2    0 value3 False False
#> 2           1 object_two    0.5      0  343 value4  True  True