【发布时间】:2018-04-01 13:46:46
【问题描述】:
我正在使用 R 中的复杂 JSON 文件(通过使用 jsonlite 包),我需要将行附加到包含嵌套数据帧的数据帧。
这是原始数据帧的结构(df,我想添加新行的一个单一观察)以及我希望添加的新行的结构(new_element)。
> str(df)
$ :'data.frame': 1 obs. of 3 variables:
..$ created_at : chr "2017-10-20 08:55:13"
..$ status : chr "Done"
..$ validation_results:'data.frame': 1 obs. of 4 variables:
.. ..$ conversions : chr "OK"
.. ..$ boxes_shipped : chr "OK"
.. ..$ outlook_history: chr "OK"
.. ..$ write2db : chr "OK"
> str(new_element)
'data.frame': 1 obs. of 3 variables:
$ created_at : chr "2017-10-20 09:20:30"
$ status : chr "Pending"
$ validation_results:'data.frame': 1 obs. of 4 variables:
..$ conversions : chr "NEW"
..$ boxes_shipped : chr "NEW"
..$ outlook_history: chr "NEW"
..$ write2db : chr "NEW"
问题来了。尝试将 new_element 添加到 df 时:
df <- rbind(df, new_element)
我收到此错误:
Error in `row.names<-.data.frame`(`*tmp*`, value = value) :
duplicate 'row.names' are not allowed
In addition: Warning message:
non-unique values when setting 'row.names': ‘1’
关于名字:
> names(df)
[1] "created_at" "status" "validation_results"
> names(new_element)
[1] "created_at" "status" "validation_results"
有人知道实际发生了什么吗?
编辑:
根据@Moody_Mudskipper 的要求,我添加了 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:
这是我期待获得的结果数据帧输出,可以使用 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:
> 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"
【问题讨论】:
-
请给
dput(df)和dput(new_element),没有数据我们做不了什么 -
我刚刚在威胁中添加了信息。任何意见将不胜感激。
-
那好多了;)。见下方答案
标签: r list dataframe nested jsonlite