使用tidyjson和R进行简单格式化
我有一个简单的JSON文件,我正试图将其强制转换为R data.frame使用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 = "
{ \"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