我正在使用 R 编程语言(和 R Studio),无法组织一些我通过 API 提取的数据,以便将其写入表中。我正在使用 StubHub API 来获取一个 JSON 响应,其中包含特定事件的所有票务列表。我可以成功调用 StubHub,我得到了成功的响应。这是我用来获取响应的代码:
# get the content part of the response
msgContent = content(response)
# format to JSON object
jsonContent = jsonlite::fromJSON(toJSON(msgContent),flatten=TRUE,simplifyVector=TRUE)
这个 JSON 对象有一个名为“listing”的节点,这是我最感兴趣的,所以我为对象的那个部分设置了一个变量:
friListings = jsonContent $listing
检查“friListings”的类,我发现我有一个 data.frame:
> class(friListings)
[1] "data.frame"
当我在 R Studio 中单击这个变量时——View(friListings)——它会在一个新选项卡中打开,并且看起来很漂亮,格式也很好。有 21 个变量(列)和 609 个观测值(行)。我看到某些单元格的空值,这是预期的。
我想将此 data.frame 写成我计算机上文件中的表格。当我尝试这样做时,我得到了这个错误。
> write.table(friListings,file="data",row.names=FALSE)
Error in if (inherits(X[[j]], "data.frame") && ncol(xj) > 1L) X[[j]] <- as.matrix(X[[j]]) :
missing value where TRUE/FALSE needed
查看其他帖子,似乎正在发生这种情况,因为我的 data.frame 实际上不是“平面”的,而是具有不同类和嵌套的列表列表。我通过 str() 对 friListings 中的每一列进行验证...。
> str(friListings[1])
'data.frame': 609 obs. of 1 variable:
$ listingId:List of 609
..$ : int 1138579989
..$ : int 1138969061
..$ : int 1138958138
(this is just the first couple of lines, there are hundreds)
另一个例子:
> str(friListings[6])
'data.frame': 609 obs. of 1 variable:
$ sellerSectionName:List of 609
..$ : chr "Upper 354 - No View"
..$ : chr "Club 303 - Obstructed/No View"
..$ : chr "Middle 254 - Obstructed/No View"
(this is just the first couple of lines, there are hundreds)
这是我尝试使用可重现示例帖子中的 dput 共享的 friListings 的负责人:
> dput(head(friListings,4))
structure(list(listingId = list(1138579989L, 1138969061L, 1138958138L,
1139003985L), sectionId = list(1552295L, 1552172L, 1552220L,
1552289L), row = list("16", "6", "22", "26"), quantity = list(
1L, 2L, 4L, 1L), sellerSectionName = list("Upper 354 - No View",
"Club 303 - Obstructed/No View", "Middle 254 - Obstructed/No View",
"353"), sectionName = list("Upper 354 - Obstructed/No View",
"Club 303 - Obstructed/No View", "Middle 254 - Obstructed/No View",
"Upper 353 - Obstructed/No View"), seatNumbers = list("21",
"7,8", "13,14,15,16", "General Admission"), zoneId = list(
232917L, 232909L, 232914L, 232917L), zoneName = list("Upper",
"Club", "Middle", "Upper"), listingAttributeList = list(structure(c(204L,
201L), .Dim = c(2L, 1L)), structure(c(4369L, 5370L), .Dim = c(2L,
1L)), structure(c(4369L, 5989L), .Dim = c(2L, 1L)), structure(c(204L,
4369L), .Dim = c(2L, 1L))), listingAttributeCategoryList = list(
structure(1L, .Dim = c(1L, 1L)), structure(1L, .Dim = c(1L,
1L)), structure(1L, .Dim = c(1L, 1L)), structure(1L, .Dim = c(1L,
1L))), deliveryTypeList = list(structure(5L, .Dim = c(1L,
1L)), structure(5L, .Dim = c(1L, 1L)), structure(5L, .Dim = c(1L,
1L)), structure(5L, .Dim = c(1L, 1L))), dirtyTicketInd = list(
FALSE, FALSE, FALSE, FALSE), splitOption = list("0", "0",
"1", "1"), ticketSplit = list("1", "2", "2", "1"), splitVector = list(
structure(1L, .Dim = c(1L, 1L)), structure(2L, .Dim = c(1L,
1L)), structure(c(2L, 4L), .Dim = c(2L, 1L)), structure(1L, .Dim = c(1L,
1L))), sellerOwnInd = list(0L, 0L, 0L, 0L), currentPrice.amount = list(
468.99, 475L, 475L, 550.45), currentPrice.currency = list(
"USD", "USD", "USD", "USD"), faceValue.amount = list(NULL,
NULL, NULL, NULL), faceValue.currency = list(NULL, NULL,
NULL, NULL)), .Names = c("listingId", "sectionId", "row",
"quantity", "sellerSectionName", "sectionName", "seatNumbers",
"zoneId", "zoneName", "listingAttributeList", "listingAttributeCategoryList",
"deliveryTypeList", "dirtyTicketInd", "splitOption", "ticketSplit",
"splitVector", "sellerOwnInd", "currentPrice.amount", "currentPrice.currency",
"faceValue.amount", "faceValue.currency"), row.names = c(NA,
4L), class = "data.frame")
我试图通过遍历 friListings 中的每一列、取消列出该节点、保存到向量然后执行 cbind 将它们拼接在一起来解决这个问题。但是,当我这样做时,由于空值,我得到了不同长度的向量。我将这种方法更进一步,并尝试对每一列进行分类以强制 NA 保留空值,但这不起作用。而且,无论如何,一定有比这更好的方法。这里有一些输出来说明当我尝试这种方法时会发生什么。
# Take the column zoneId and casting it as numeric to force NA
friListings$zoneId<-lapply(friListings$zoneId, as.numeric)
# check the length
> length(friListings$zoneId)
[1] 609
# unlist and check the length... and I lost 11 items
> zoneid <- unlist(friListings$zoneId, use.names=FALSE)
> length(zoneid)
[1] 598
# here's the tail of the column... (because I happen to know that's where the empty values that are being dropped are)
> tail(friListings$zoneId)
[[1]]
numeric(0)
[[2]]
numeric(0)
[[3]]
numeric(0)
[[4]]
numeric(0)
[[5]]
numeric(0)
[[6]]
numeric(0)
我知道人们一直在使用 JSON 和 R(我显然不是其中之一!),所以也许我遗漏了一些明显的东西。但我花了 5 个小时尝试不同的方法来清理这些数据并在互联网上搜索答案。我也阅读了 JSON 包文档。
我真的只是想“展平”这个对象,使其美观且结构化,就像我在查看(friListings)时 R Studio 呈现它一样。我已经在上面的“fromJSON”调用中传递了“flatten=TRUE”,但它似乎并没有达到我的预期。与“simplifyVector=TRUE”相同(根据文档默认为 TRUE,但为清楚起见添加了它)。
感谢您提供的任何见解或指导!!!