R 向数据帧添加新行(其中包含嵌套的数据帧)时出现问题

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

我正在R中处理复杂的JSON文件(通过使用jsonlite包),我需要将行附加到dataframa中,dataframa中包含嵌套的数据帧

以下是原始数据帧的结构(df,仅包含一个观察值,我想添加新行)以及我想添加的新行的结构(new_element

问题来了。尝试向df添加新元素时:

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使第一步更轻松