在R中,我想从嵌套的列表列表中提取第一个项目;但有时列表可能是空的。
e.g:
myList <- list(
list(ID = 1, Sales = 1000, Product = "Car"),
list(ID = 2, Sales = 2000, Product = "Boat"),
list(ID = 3, Sales = 1500, Product = "Bike")
)
myList2 <- list()
所以当我拨打以下电话时:
myList[[1]]
myList2[[1]]
第一个调用会返回一个有效的子列表(ID=1
,Sales=1000
,Product = "Car"
)但第二个调用会返回错误 -
Error in myList2[[1]] : subscript out of bounds
是否有一个简单的调用我可以说“填充列表时返回项目1,否则返回NULL
并且不会抛出错误”?
答案 0 :(得分:2)
如果NULL
为0,我们可以创建一个返回length
的函数,或者返回list
的子集
f1 <- function(lst, ind){
if(length(lst) >=1) lst[[ind]] else NULL
}
f1(myList2, 1)
#NULL
f1(myList, 1)
#$ID
#[1] 1
#$Sales
#[1] 1000
#$Product
#[1] "Car"
答案 1 :(得分:1)
您可以使用tryCatch
以便在出现错误时为其提供替代方案,即
f1 <- function(x){
tryCatch(x, error = function(i)return(NULL))
}
f1(myList[[1]])
#$ID
#[1] 1
#$Sales
#[1] 1000
#$Product
#[1] "Car"
f1(myList2[[1]])
#NULL
答案 2 :(得分:1)
您可以使用first
软件包的dplyr
功能:
first(myList, default = NULL)
first(myList2, default = NULL)
此处提供有关该功能的更多信息:https://dplyr.tidyverse.org/reference/nth.html
答案 3 :(得分:0)
您可以使用[1]
和el()
或[[1]]
获得结果。 [1]
返回仅包含第一个元素的列表。它在空列表中返回NULL
。然后,您必须使用el()
ir [[1]]
参见示例。
myList1 <- list(
list(ID = 1, Sales = 1000, Product = "Car"),
list(ID = 2, Sales = 2000, Product = "Boat"),
list(ID = 3, Sales = 1500, Product = "Bike")
)
myList2 <- list()
el(myList1[1])
el(myList2[1])
myList1[1][[1]]
myList2[1][[1]]
输出:
> el(myList1[1])
$ID
[1] 1
$Sales
[1] 1000
$Product
[1] "Car"
> el(myList2[1])
NULL