【发布时间】:2020-05-23 18:44:31
【问题描述】:
我有一个大型多维数组(大约 1900 万个元素),其中包含许多不同属性的联合概率。
数组非常稀疏,我只对具有非零概率的单元格感兴趣。
但是,在为非零元素过滤数组时,我无法检索过滤值的维度名称(对应于各种属性值)。
这是一个玩具示例:
array_dim <- c(2,5,5,4)
array_fill <- runif(prod(array_dim))
array_dimnames <- list(
c('strawberry', 'blackberry'),
c('cranberry', 'banana', 'pineapple', 'apple', 'tangerine'),
c('orange', 'blueberry', 'kiwi', 'grapes', 'guava'),
c('plum', 'fig', 'grapefruit', 'lemon')
)
fruits <- array(array_fill, dim=array_dim, dimnames=array_dimnames)
我可以得到匹配某个标准(这里> 0.9)的单元格的索引值如下:
> which(fruits %in% fruits[fruits>0.9], arr.ind = TRUE)
[1] 8 23 25 32 33 35 37 76 77 85 90 101 117 121 123 135 154 197
但我无法使用上述索引值并找出它们是什么水果组合,因为在查找特定单元格值时,dimnames 会被删除:
> fruits[8]
[1] 0.9590207
> fruits[8, drop=FALSE]
[1] 0.9590207
> dimnames(fruits[8])
NULL
> names(fruits[8])
NULL
我尝试将数组转换为 data.frame 并使用drop=FALSE 参数:
> fruits.df <- as.data.frame(fruits)
>
> fruits.df[1,2,drop=FALSE]
banana.orange.plum
strawberry 0.4003854
但添加条件过滤器失败,因为fruits.df[fruits.df > 0.9,,drop=FALSE] 返回一堆NA。
作为最后的手段,我可以在单独的数据结构中构建自己的 array_index -> dimnames 映射,但如果有更优雅/高效的解决方案,我会很高兴。
我也在调查listarrays package。
提前致谢
【问题讨论】:
-
在下面查看一个可能的答案;另见stackoverflow.com/questions/21074240/…
-
不敢相信我没有找到那个帖子...,谢谢