在列表嵌套列表中查找矩阵内向量的存在

3

我尝试使用 R 语言在一个列表嵌套矩阵中查找一个向量 'ab' 是否存在,但使用以下的 'exists' 代码均未能实现。请问如何使其正常运行?

 aa <- list(x = matrix(1,2,3), y = 4, z = 3)
 colnames(aa$x) <- c('ab','bb','cb')
 aa 
 #$x
 #     ab bb cb
 #[1,]  1  1  1
 #[2,]  1  1  1
 #
 #$y
 #[1] 4
 #
 #$z
 #[1] 3

 exists('ab', where=aa)
 #[1] FALSE
 exists('ab', where=aa$x)
 # Error in exists("ab", where = aa$x) : invalid 'envir' argument
 exists('ab', where=colnames(aa$x))
 # Error in as.environment(where) : no item called "ab" on the search list
 colnames(aa$x)
 #[1] "ab" "bb" "cb"

1
“ab”不是一个“向量”,它只是一个“矩阵”的列名(该矩阵并非由向量组成,但它是一个带有“dim”和“dimnames”属性的向量)。您可以使用"ab" %in% colnames(aa$x)来检查aa列表中作为x元素的矩阵是否包含名为ab的列。 - nicola
你是想查找名称为“ab”的还是内容为“ab”的? - Paulo E. Cardoso
1个回答

3
列名是“矩阵”或“数据框”的一部分。因此,我们使用“sapply”循环遍历“列表”,获取列名(colnames),将其转换为向量(unlist),并检查“ab”是否在该向量中。
'ab' %in% unlist(sapply(aa, colnames)) 
#[1] TRUE

如果我们想针对特定的列表元素更加具体,我们要提取元素(aa$x),获取列名称并检查其中是否包含“ab”。

'ab' %in% colnames(aa$x)
#[1] TRUE

另外一种选择是循环遍历'aa',如果元素是一个矩阵,提取'ab'列并检查它是否是一个向量,用any将包装起来以获得单个TRUE/FALSE输出。

any(sapply(aa, function(x) if(is.matrix(x)) is.vector(x[, 'ab']) else FALSE))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接