R列表子集使用“[[”显示错误下标超出范围

时间:2018-02-14 01:25:07

标签: r sapply purrr

我试图使用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()

这里的问题是“[[”或“$”功能对这个大型列表不起作用,只有“[”有效。

4 个答案:

答案 0 :(得分:0)

如果您想将listing_id条目转换为数字,请直接使用as.numeric

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

sapply是您希望将函数应用于向量中的每个元素时使用的内容。但由于as.numeric已经过矢量化,因此在这种情况下您不需要应用函数。

答案 1 :(得分:0)

正如@JesseTweedle所述,您的问题是特定于数据的问题。数据对象 listing_id 中的某个位置不作为命名元素存在,因此会出错。考虑将sapply函数包含在tryCatch中,以便在没有 listing_id [[$的情况下为这些元素返回NAs:

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

此外,根据您的帖子,您看起来有一个嵌套结构,其中包含一个名为的列表。试试这个:

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

答案 2 :(得分:0)

你有我称之为“嵌套列表”的东西。您可以从str输出中看到“元素树”顶部只有一个项目。试试这个:

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

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

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

答案 3 :(得分:0)

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