使用“[[”的R列表子集显示错误下标越界
R List subsetting using "[[" shows error subscript out of bounds
我试图对一个包含 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()
这里的问题是“[[”或“$”函数不适用于这个大列表,只有“[”有效。
如果要将listing_id
条目转换为数字,直接使用as.numeric
即可:
listings_England$listing_id <- as.numeric(listings_England$listing_id)
sapply
是您要对向量中的每个元素应用函数时使用的方法。但由于 as.numeric
已经矢量化,因此在这种情况下您不需要应用函数。
正如@JesseTweedle 评论的那样,您的问题是一个特定于数据的问题。数据对象中的某处 listing_id 不作为命名元素存在,因此会出错。考虑将你的 sapply
函数包装在 tryCatch
到 return NAs 中,对于那些没有 listing_id 的元素,使用 [[
或$
:
id2 <- sapply(listings_England[1:100000], function(x)
tryCatch(x[["listing_id"]],
warning = function(w) return(NA),
error = function(e) return(NA)
)
)
此外,根据您的 post,您似乎有一个嵌套结构,其中包含一个名为 listing 的结构。试试这个:
id2 <- sapply(listings_England[1:100000], function(x)
tryCatch(x$listing$listing_id,
warning = function(w) return(NA),
error = function(e) return(NA)
)
)
你有我所说的 "nested list"。您可以从 str 输出中看到,您的 "element tree" 顶部只有一项。试试这个:
id1 <- sapply(listings_England[[1]], "[[", "listing_id")
然后提取第一项(包含所有内容)并处理结果列表。也可以使用等价操作:
id1 <- sapply(listings_England$listing, "[[", "listing_id")
这是“Missing/out of bounds indices”问题,[ 和 [[ 在索引超出范围 (OOB) 时的行为略有不同。详细信息可以在 "Advanced R" 本书第4.3.3节(以下link)
[https://adv-r.hadley.nz/subsetting.html#subsetting-operators]
我试图对一个包含 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()
这里的问题是“[[”或“$”函数不适用于这个大列表,只有“[”有效。
如果要将listing_id
条目转换为数字,直接使用as.numeric
即可:
listings_England$listing_id <- as.numeric(listings_England$listing_id)
sapply
是您要对向量中的每个元素应用函数时使用的方法。但由于 as.numeric
已经矢量化,因此在这种情况下您不需要应用函数。
正如@JesseTweedle 评论的那样,您的问题是一个特定于数据的问题。数据对象中的某处 listing_id 不作为命名元素存在,因此会出错。考虑将你的 sapply
函数包装在 tryCatch
到 return NAs 中,对于那些没有 listing_id 的元素,使用 [[
或$
:
id2 <- sapply(listings_England[1:100000], function(x)
tryCatch(x[["listing_id"]],
warning = function(w) return(NA),
error = function(e) return(NA)
)
)
此外,根据您的 post,您似乎有一个嵌套结构,其中包含一个名为 listing 的结构。试试这个:
id2 <- sapply(listings_England[1:100000], function(x)
tryCatch(x$listing$listing_id,
warning = function(w) return(NA),
error = function(e) return(NA)
)
)
你有我所说的 "nested list"。您可以从 str 输出中看到,您的 "element tree" 顶部只有一项。试试这个:
id1 <- sapply(listings_England[[1]], "[[", "listing_id")
然后提取第一项(包含所有内容)并处理结果列表。也可以使用等价操作:
id1 <- sapply(listings_England$listing, "[[", "listing_id")
这是“Missing/out of bounds indices”问题,[ 和 [[ 在索引超出范围 (OOB) 时的行为略有不同。详细信息可以在 "Advanced R" 本书第4.3.3节(以下link) [https://adv-r.hadley.nz/subsetting.html#subsetting-operators]