【发布时间】:2021-09-18 21:22:15
【问题描述】:
我想将数据框转换为嵌套的 json 对象,并根据列名确定在哪里创建嵌套的 json 对象。
我做了一个玩具例子来解释这个问题。鉴于此数据框:
df <- read.csv(textConnection(
"id,name,allergies.pollen,allergies.pet,attributes.height,attributes.gender
x,alice,no,yes,175,female
y,bob,yes,yes,180,male"))
或者以更易读的格式:
id name allergies.pollen allergies.pet attributes.height attributes.gender
1 x alice no yes 175 female
2 y bob yes yes 180 male
那我想要下面的json对象:
'[
{
"id": "x",
"name": "alice",
"allergies":
{
"pollen": "no",
"pet": "yes"
},
"attributes":
{
"height": "175",
"gender": "female"
}
},
{
"id": "y",
"name": "bob",
"allergies":
{
"pollen": "yes",
"pet": "yes"
},
"attributes":
{
"height": "180",
"gender": "male"
}
}
]'
所以它应该自动在固定分隔符“.”处对列进行分组。
理想情况下,它也应该能够处理嵌套嵌套的对象,例如allergies.pet.cat 和 allergies.pet.dog。
解决这个问题我最好的想法是创建一个函数,递归调用jsonlite::toJSON 并使用stringr::str_extract("^[^.]*") 提取类别,但我无法完成这项工作。
【问题讨论】:
-
请说出您期望发生碰撞时会发生什么,例如同时具有
allergies.pet和allergies.pet.cat。一般来说,如果您的样本数据有第二个嵌套,这将有助于答案的完整性。 -
我希望子类别也可以嵌套,即
{"allergies" : {"pet": {"dog": "yes", "cat": "yes"}}}。 -
对于碰撞我没有考虑过,所以经销商选择。但我认为你的回答处理它的方式是明智的。