【发布时间】:2016-12-21 02:46:32
【问题描述】:
我在 R 中有以下列表 mylist 我正在从我试图在运行函数 jsonlite::rbind.pages() 之前修改的foursquare api返回,因为有一个嵌套数据框返回了 0 个输入值。当我尝试运行函数 rbindpages 时,它返回 3 个结果,而不是 4 个消除具有 0 值的数据帧。我将如何在其中插入值,以便当我使用 rbind.pages() 时收到所有 4 个结果?目的是之后使用cbind()与其他向量合并。
这是控制台的输出:
[[1]]
id name pluralName shortName icon.prefix icon.suffix primary
1 4bf58dd8d48988d1fa931735 Hotel Hotels Hotel https://ss3.4sqi.net/img/categories_v2/travel/hotel_ .png TRUE
[[2]]
id name pluralName shortName icon.prefix icon.suffix primary
1 4bf58dd8d48988d10f951735 Pharmacy Pharmacies Pharmacy https://ss3.4sqi.net/img/categories_v2/shops/pharmacy_ .png TRUE
[[3]]
data frame with 0 columns and 0 rows
[[4]]
id name pluralName shortName icon.prefix
1 52e81612bcbc57f1066b7a32 Cultural Center Cultural Centers Cultural Center https://ss3.4sqi.net/img/categories_v2/building/default_
icon.suffix primary
1 .png TRUE
这是输出:
mylist = list(structure(list(id = "4bf58dd8d48988d1fa931735", name = "Hotel",
pluralName = "Hotels", shortName = "Hotel", icon = structure(list(
prefix = "https://ss3.4sqi.net/img/categories_v2/travel/hotel_",
suffix = ".png"), .Names = c("prefix", "suffix"), class = "data.frame", row.names = 1L),
primary = TRUE), .Names = c("id", "name", "pluralName", "shortName",
"icon", "primary"), class = "data.frame", row.names = 1L), structure(list(
id = "4bf58dd8d48988d10f951735", name = "Pharmacy", pluralName = "Pharmacies",
shortName = "Pharmacy", icon = structure(list(prefix = "https://ss3.4sqi.net/img/categories_v2/shops/pharmacy_",
suffix = ".png"), .Names = c("prefix", "suffix"), class = "data.frame", row.names = 1L),
primary = TRUE), .Names = c("id", "name", "pluralName", "shortName",
"icon", "primary"), class = "data.frame", row.names = 1L), structure(list(), .Names = character(0), row.names = integer(0), class = "data.frame"),
structure(list(id = "52e81612bcbc57f1066b7a32", name = "Cultural Center",
pluralName = "Cultural Centers", shortName = "Cultural Center",
icon = structure(list(prefix = "https://ss3.4sqi.net/img/categories_v2/building/default_",
suffix = ".png"), .Names = c("prefix", "suffix"), class = "data.frame", row.names = 1L),
primary = TRUE), .Names = c("id", "name", "pluralName",
"shortName", "icon", "primary"), class = "data.frame", row.names = 1L),
structure(list(id = "4bf58dd8d48988d1e0931735", name = "Coffee Shop",
pluralName = "Coffee Shops", shortName = "Coffee Shop",
icon = structure(list(prefix = "https://ss3.4sqi.net/img/categories_v2/food/coffeeshop_",
suffix = ".png"), .Names = c("prefix", "suffix"), class = "data.frame", row.names = 1L),
primary = TRUE), .Names = c("id", "name", "pluralName",
"shortName", "icon", "primary"), class = "data.frame", row.names = 1L))
我注意到在寻找条件过滤器时,运行nchar(mylist[3]) 我得到“6”,所以我的想法是运行类似以下内容来查明“0 数据框”,然后插入字符。只是一个概念,所以任何帮助表示赞赏!
mylist = lapply(mylist, function (x) {
if (nchar(x) == 6) {
x== data.frame(
list(id = "4bf58dd8d48988d1e0931735", name = "Not avaliable",
pluralName = "Not avaliable", shortName = "Not avaliable",
icon = "https://ss3.4sqi.net/img/categories_v2/food", prefix = "https://ss3.4sqi.net/img/categories_v2/food/coffeeshop_",
suffix = ".png")
)
} else {
x
}
})
编辑****************** 使用评论中的建议,我得到以下信息:
[[11]]
[[11]][[1]]
id name pluralName shortName icon.prefix icon.suffix primary
1 4bf58dd8d48988d1fa931735 Hotel Hotels Hotel https://ss3.4sqi.net/img/categories_v2/travel/hotel_ .png TRUE
[[12]]
NULL
[[13]]
[[13]][[1]]
id name pluralName shortName icon.prefix icon.suffix
1 52e81612bcbc57f1066b7a33 Social Club Social Clubs Social Club https://ss3.4sqi.net/img/categories_v2/building/default_ .png
primary
1 TRUE
我跑了jsonlite::rbind.pages(),得到了Error: all(vapply(pages, is.data.frame, logical(1))) is not TRUE
【问题讨论】:
-
你可以插入一个
NULL,因为rbind(NULL, df)返回df。lapply(mylist, function(x) ifelse(nrow(x) == 0 , NULL, x) ) -
没用。我在编辑中添加了输出,所以你可以看到结果
-
放弃你原来的方法,试试:
mylist = lapply(mylist, function (x) { if (length(x) == 0) { x<- data.frame( list(id = "4bf58dd8d48988d1e0931735", name = "Not avaliable", pluralName = "Not avaliable", shortName = "Not avaliable", icon = "https://ss3.4sqi.net/img/categories_v2/food", prefix = "https://ss3.4sqi.net/img/categories_v2/food/coffeeshop_", suffix = ".png") ) } else { x <- x } }) -
您的方法绝对是正确的方向,只需向数据框添加一些变量即可使其正常工作。把答案贴在上面。谢谢!
标签: json r foursquare rbind