【问题标题】:R List subsetting using "[[" shows error subscript out of bounds使用“[[”的R列表子集显示错误下标越界
【发布时间】:2018-02-14 01:25:06
【问题描述】:

我试图对一个包含 278226 个元素的大列表进行子集化,每个元素(如下所示)也是一个列表,其中包含多个(39 到 50 之间)子元素(大小为 1 的具有不同名称的原子向量)。

> str(listings_England[9922])
List of 1
 $ listing:List of 40
  ..$ agent_address       : chr "35 John Street, Luton"
  ..$ agent_logo          : chr "https://st.zoocdn.com/zoopla_static_agent_logo_(257607).png"
  ..$ agent_name          : chr "Ashton Carter Homes"
  ..$ agent_phone         : chr "020 8115 4543"
  ..$ category            : chr "Residential"
  ..$ country             : NULL
  ..$ country_code        : chr "gb"
  ..$ county              : NULL
  ..$ displayable_address : chr "Hatters Way Luton, Luton LU1"
  ..$ first_published_date: chr "2017-11-16 17:25:36"
  ..$ last_published_date : chr "2018-01-29 18:40:52"
  ..$ latitude            : chr "51.88188"
  ..$ listing_id          : chr "39336869"
  ..$ listing_status      : chr "sale"
  ..$ longitude           : chr "-0.43237194"

然后我提取“listing_id”等子元素如下:

> id1 <- sapply(listings_England, "[[", "listing_id")
Error in FUN(X[[i]], ...) : subscript out of bounds
> id3 <- sapply(listings_England[1:100000], "[[", "listing_id")
Error in FUN(X[[i]], ...) : subscript out of bounds
> id2 <- sapply(listings_England[1:50000], "[[", "listing_id")
> 

> listings_England$listing_id
NULL
> 

如您所见,它仅适用于最后一个(purrr::map 系列函数的问题相同)。我想知道这是否是这些功能的限制。而我目前的解决方案是:

id <- sapply(listings_England, function(x) x["listing_id"]) %>% as.numeric()

这里的问题是“[[”或“$”函数不适用于这个大列表,只有“[”有效。

【问题讨论】:

  • 如果它适用于元素 1:50000 但不适用于 1:100000我打赌50000:100000 范围内的元素没有 listing_id财产,或者整个事情是NULL
  • @JesseTweedle 是的,你是对的!它是 NULL 导致这个问题。谢谢!
  • 列表很烦人,而且大的更糟糕,因为它们会抛出奇怪的错误,无法为您指明正确的方向。如果可以的话,我通常会尽快将它们转换为小标题(直接使用enframebind_rows 或与map 结合使用)。
  • 哦,还有两个建议:直接bind_rows(listings_England),或者purrr:discard(listings_England, is.null) 立即删除NULL 元素。

标签: r sapply purrr


【解决方案1】:

作为@JesseTweedle cmets,您的问题是特定于数据的问题。您的数据对象中的某处 listing_id 不作为命名元素存在,因此会出错。考虑将sapply 函数包装在tryCatch 中,以使用[[$ 为那些没有listing_id 的元素返回NA:

id2 <- sapply(listings_England[1:100000], function(x) 
                 tryCatch(x[["listing_id"]],
                          warning = function(w) return(NA),
                          error = function(e) return(NA)
                 )
       ) 

此外,根据您的帖子,您似乎有一个嵌套结构,其中包含一个名为 listing 的嵌套结构。试试这个:

id2 <- sapply(listings_England[1:100000], function(x) 
                 tryCatch(x$listing$listing_id,
                          warning = function(w) return(NA),
                          error = function(e) return(NA)
                 )
       ) 

【讨论】:

    【解决方案2】:

    如果要将listing_id 项转换为数字,只需直接使用as.numeric

    listings_England$listing_id <- as.numeric(listings_England$listing_id)
    

    sapply 是如果您想将函数应用于向量中的每个元素,您将使用它。但由于as.numeric 已经矢量化,在这种情况下您不需要应用函数。

    【讨论】:

    • 我想从这个大列表中的所有 278226 个元素中提取所有“listing_id”并保存在一个向量中,而不是转换为数字,实际上并不关心它是数字还是字符。
    • @YunlongHuang listings_England$listing_id 已经为您提供了一个包含 278226 个元素的向量。我不确定你在这里要求什么。
    • class(listings_England) 向您展示了什么?大小与您的问题无关。
    • > class(listings_England) [1] "list"
    • 我认为尺寸是问题的原因是因为我有另一个较小尺寸的列表没有这样的问题。
    【解决方案3】:

    你有我所说的“嵌套列表”。您可以从 str 输出中看到,“元素树”的顶部只有一项。试试这个:

    id1 <- sapply(listings_England[[1]], "[[", "listing_id")
    

    然后它提取第一个项目(包含所有内容)并处理结果列表。也可以使用等效操作:

    id1 <- sapply(listings_England$listing, "[[", "listing_id")
    

    【讨论】:

      【解决方案4】:

      这是“丢失/超出范围的索引”问题,[ 和 [[ 在索引超出范围 (OOB) 时的行为略有不同。详细信息可以在“高级 R”书 4.3 节中找到。 3(以下链接) [https://adv-r.hadley.nz/subsetting.html#subsetting-operators]

      【讨论】:

        猜你喜欢
        • 2015-04-03
        • 2015-02-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多