R 向数据帧添加新行(其中包含嵌套的数据帧)时出现问题
我正在R中处理复杂的JSON文件(通过使用jsonlite包),我需要将行附加到dataframa中,dataframa中包含嵌套的数据帧 以下是原始数据帧的结构(df,仅包含一个观察值,我想添加新行)以及我想添加的新行的结构(new_element) 问题来了。尝试向df添加新元素时:R 向数据帧添加新行(其中包含嵌套的数据帧)时出现问题,r,list,dataframe,nested,jsonlite,R,List,Dataframe,Nested,Jsonlite,我正在R中处理复杂的JSON文件(通过使用jsonlite包),我需要将行附加到dataframa中,dataframa中包含嵌套的数据帧 以下是原始数据帧的结构(df,仅包含一个观察值,我想添加新行)以及我想添加的新行的结构(new_element) 问题来了。尝试向df添加新元素时: df <- rbind(df, new_element) > result <- read_from_JSON('output.json') > jsonlite::toJSON(re
df <- rbind(df, new_element)
> result <- read_from_JSON('output.json')
> jsonlite::toJSON(result, pretty = TRUE)
[
{
"created_at": "2017-10-20 08:55:13",
"status": "Done",
"validation_results": {
"conversions": "OK",
"boxes_shipped": "OK",
"outlook_history": "OK",
"write2db": "OK"
}
},
{
"created_at": "2017-10-20 09:20:30",
"status": "Pending",
"validation_results": {
"conversions": "NEW",
"boxes_shipped": "NEW",
"outlook_history": "NEW",
"write2db": "NEW"
}
}
]
> str(result)
'data.frame': 2 obs. of 3 variables:
$ created_at : chr "2017-10-20 08:55:13" "2017-10-20 09:20:30"
$ status : chr "Done" "Pending"
$ validation_results:'data.frame': 2 obs. of 4 variables:
..$ conversions : chr "OK" "NEW"
..$ boxes_shipped : chr "OK" "NEW"
..$ outlook_history: chr "OK" "NEW"
..$ write2db : chr "OK" "NEW"
有人知道实际发生了什么吗
编辑:
df <- rbind(df, new_element)
> result <- read_from_JSON('output.json')
> jsonlite::toJSON(result, pretty = TRUE)
[
{
"created_at": "2017-10-20 08:55:13",
"status": "Done",
"validation_results": {
"conversions": "OK",
"boxes_shipped": "OK",
"outlook_history": "OK",
"write2db": "OK"
}
},
{
"created_at": "2017-10-20 09:20:30",
"status": "Pending",
"validation_results": {
"conversions": "NEW",
"boxes_shipped": "NEW",
"outlook_history": "NEW",
"write2db": "NEW"
}
}
]
> str(result)
'data.frame': 2 obs. of 3 variables:
$ created_at : chr "2017-10-20 08:55:13" "2017-10-20 09:20:30"
$ status : chr "Done" "Pending"
$ validation_results:'data.frame': 2 obs. of 4 variables:
..$ conversions : chr "OK" "NEW"
..$ boxes_shipped : chr "OK" "NEW"
..$ outlook_history: chr "OK" "NEW"
..$ write2db : chr "OK" "NEW"
根据@Moody_mudscapper的要求,我添加了dput输出
> dput(df)
structure(list(created_at = "2017-10-20 12:15:52", status = "Done",
validation_results = structure(list(conversions = "OK",
boxes_shipped = "OK", outlook_history = "OK", write2db = "OK"), .Names = c("conversions",
"boxes_shipped", "outlook_history", "write2db"), row.names = c(NA,
-1L), class = "data.frame")), .Names = c("created_at", "status",
"validation_results"), row.names = 1L, class = "data.frame")
> dput(new_element)
structure(list(created_at = "2017-10-20 12:16:12", status = "Pending",
validation_results = structure(list(conversions = "NEW",
boxes_shipped = "NEW", outlook_history = "NEW", write2db = "NEW"), .Names = c("conversions",
"boxes_shipped", "outlook_history", "write2db"), row.names = c(NA,
-1L), class = "data.frame")), .Names = c("created_at", "status",
"validation_results"), row.names = 1L, class = "data.frame")
EDIT2:
df <- rbind(df, new_element)
> result <- read_from_JSON('output.json')
> jsonlite::toJSON(result, pretty = TRUE)
[
{
"created_at": "2017-10-20 08:55:13",
"status": "Done",
"validation_results": {
"conversions": "OK",
"boxes_shipped": "OK",
"outlook_history": "OK",
"write2db": "OK"
}
},
{
"created_at": "2017-10-20 09:20:30",
"status": "Pending",
"validation_results": {
"conversions": "NEW",
"boxes_shipped": "NEW",
"outlook_history": "NEW",
"write2db": "NEW"
}
}
]
> str(result)
'data.frame': 2 obs. of 3 variables:
$ created_at : chr "2017-10-20 08:55:13" "2017-10-20 09:20:30"
$ status : chr "Done" "Pending"
$ validation_results:'data.frame': 2 obs. of 4 variables:
..$ conversions : chr "OK" "NEW"
..$ boxes_shipped : chr "OK" "NEW"
..$ outlook_history: chr "OK" "NEW"
..$ write2db : chr "OK" "NEW"
这就是我期待获得的结果数据帧输出,它将通过使用jsonlite包转换为JSON文件
> str(result)
'data.frame': 2 obs. of 3 variables:
$ created_at : chr "2017-10-20 08:55:13" "2017-10-20 09:20:30"
$ status : chr "Done" "Pending"
$ validation_results:'data.frame': 2 obs. of 4 variables:
..$ conversions : chr "OK" "NEW"
..$ boxes_shipped : chr "OK" "NEW"
..$ outlook_history: chr "OK" "NEW"
..$ write2db : chr "OK" "NEW"
> dput(result)
structure(list(created_at = c("2017-10-20 08:55:13", "2017-10-20
09:20:30"), status = c("Done", "Pending"), validation_results = structure(list(
conversions = c("OK", "NEW"), boxes_shipped = c("OK", "NEW"
), outlook_history = c("OK", "NEW"), write2db =
c("OK", "NEW")), .Names = c("conversions", "boxes_shipped",
"outlook_history", "write2db"), class = "data.frame", row.names =
1:2)), .Names = c("created_at",
"status", "validation_results"), class = "data.frame", row.names =
1:2)
EDIT3:
df <- rbind(df, new_element)
> result <- read_from_JSON('output.json')
> jsonlite::toJSON(result, pretty = TRUE)
[
{
"created_at": "2017-10-20 08:55:13",
"status": "Done",
"validation_results": {
"conversions": "OK",
"boxes_shipped": "OK",
"outlook_history": "OK",
"write2db": "OK"
}
},
{
"created_at": "2017-10-20 09:20:30",
"status": "Pending",
"validation_results": {
"conversions": "NEW",
"boxes_shipped": "NEW",
"outlook_history": "NEW",
"write2db": "NEW"
}
}
]
> str(result)
'data.frame': 2 obs. of 3 variables:
$ created_at : chr "2017-10-20 08:55:13" "2017-10-20 09:20:30"
$ status : chr "Done" "Pending"
$ validation_results:'data.frame': 2 obs. of 4 variables:
..$ conversions : chr "OK" "NEW"
..$ boxes_shipped : chr "OK" "NEW"
..$ outlook_history: chr "OK" "NEW"
..$ write2db : chr "OK" "NEW"
>result jsonlite::toJSON(result,pretty=TRUE)
[
{
“创建时间”:“2017-10-20 08:55:13”,
“状态”:“完成”,
“验证结果”:{
“转换”:“确定”,
“已装运的箱子”:“确定”,
“outlook_history”:“OK”,
“write2db”:“确定”
}
},
{
“创建时间”:“2017-10-20 09:20:30”,
“状态”:“待定”,
“验证结果”:{
“转换”:“新”,
“已装运的箱子”:“新的”,
“展望历史”:“新”,
“write2db”:“新建”
}
}
]
>str(结果)
“data.frame”:2个obs。共有3个变量:
$created_地址:chr“2017-10-20 08:55:13”“2017-10-20 09:20:30”
$status:chr“完成”“挂起”
$validation\u results:'data.frame':2个obs。共有4个变量:
..$conversions:chr“OK”“NEW”
..$box_装运:chr“OK”“NEW”
..$outlook\u历史记录:chr“OK”“NEW”
..$write2db:chr“确定”“新”
仔细检查新元素
和结果[2]之间的差异后,]
:
new_element <- within(new_element,rownames(validation_results) <- 2)
new_df <- rbind(df,new_element)
identical(new_df,result)
# FALSE -> not all mysteries are solved
identical(toJSON(new_df,pretty=TRUE),toJSON(result,pretty=TRUE))
# TRUE -> but that should be good enough
旧答案:
df <- rbind(df, new_element)
> result <- read_from_JSON('output.json')
> jsonlite::toJSON(result, pretty = TRUE)
[
{
"created_at": "2017-10-20 08:55:13",
"status": "Done",
"validation_results": {
"conversions": "OK",
"boxes_shipped": "OK",
"outlook_history": "OK",
"write2db": "OK"
}
},
{
"created_at": "2017-10-20 09:20:30",
"status": "Pending",
"validation_results": {
"conversions": "NEW",
"boxes_shipped": "NEW",
"outlook_history": "NEW",
"write2db": "NEW"
}
}
]
> str(result)
'data.frame': 2 obs. of 3 variables:
$ created_at : chr "2017-10-20 08:55:13" "2017-10-20 09:20:30"
$ status : chr "Done" "Pending"
$ validation_results:'data.frame': 2 obs. of 4 variables:
..$ conversions : chr "OK" "NEW"
..$ boxes_shipped : chr "OK" "NEW"
..$ outlook_history: chr "OK" "NEW"
..$ write2db : chr "OK" "NEW"
源格式有点笨拙,因此我们将进行一些争论,以将验证\u结果
列设置为数据.frames的列表
library(dplyr)
library(purrr)
new_df <- list(df,new_element) %>% map(. %>% map_at("validation_results",list)) %>% bind_rows
# created_at status validation_results
# <chr> <chr> <list>
# 1 2017-10-20 12:15:52 Done <data.frame [1 x 4]>
# 2 2017-10-20 12:16:12 Pending <data.frame [1 x 4]>
考虑基本R的data.frame()
构造函数绑定向量和列赋值:
desired_df <- data.frame(
create_at = c(df$created_at, new_element$created_at),
status = c(df$status, new_element$status),
stringsAsFactors = FALSE
)
# ASSIGN NESTED DF TO NEW COLUMN
desired_df$validation_results = rbind(df$validation_results,
new_element$validation_results)
str(desired_df)
# 'data.frame': 2 obs. of 3 variables:
# $ create_at : chr "2017-10-20 12:15:52" "2017-10-20 12:16:12"
# $ status : chr "Done" "Pending"
# $ validation_results:'data.frame': 2 obs. of 4 variables:
# ..$ conversions : chr "OK" "NEW"
# ..$ boxes_shipped : chr "OK" "NEW"
# ..$ outlook_history: chr "OK" "NEW"
# ..$ write2db : chr "OK" "NEW"
请给出dput(df)
和dput(新元素)
,没有数据我们做不了什么,我只是在威胁中添加了信息。如果您有任何意见,我们将不胜感激。请看下面的答案,这确实是一个解决方案。我真的很感谢你的努力。谢谢然而,当将结构转换为JSON时,它并不像我希望的那样工作。我刚刚添加了我正在寻找的数据帧输出结构作为EDIT2。也能看一下吗?我明白了。。。我必须承认这些嵌套的数据帧令人困惑。你已经手写了结果的结构了吗?因为这对我来说没有多大意义(将你的两个观察嵌入到两个观察中)。你能分享你试图转换回JSON的那一行吗?如果这真的是我们的目标,我们可以直接去那里。我确实读了我制作的一个“已经附加”的JSON文件,并使用jsonlite读取了它。查看EDIT3。非常感谢!:)现在您可以看到JSON了,您的解决方案将输出:“validation_results:[{“conversions:“NEW”,“Box_shipped:“NEW”,“outlook_history:“NEW”,“write2db:“NEW”}]->注意,[{}之前的[]使validation_results变成了一个对象列表。我更新了我的解决方案,告诉我它是否解决了您的问题(代码:)。您可以通过键入:required\u df使第一步更轻松