【问题标题】:Inserting characters in a nested list from a JSON request从 JSON 请求在嵌套列表中插入字符
【发布时间】: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)返回dflapply(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


【解决方案1】:

按照康威的建议,对他的答案进行了一些调整,结果奏效了:

  mylist = lapply(mylist, function (x) { 
    if (length(x) == 0) { 
      x<- data.frame( list(id = "00000000000000000",
                           name = "Not avaliable", 
                                pluralName = "Not avaliable",
                           shortName = "Not avaliable", 
                             icon.prefix = "https://ss3.4sqi.net/img/categories_v2/food", 
                           icon.suffix = ".png",
                           primary = "TRUE") ) 
      } else { 
        x <- x } })

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多