【问题标题】:How to obtain the dimnames of a single cell in multidimensional R array?如何获取多维R数组中单个单元格的dimnames?
【发布时间】: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 &gt; 0.9,,drop=FALSE] 返回一堆NA

作为最后的手段,我可​​以在单独的数据结构中构建自己的 array_index -&gt; dimnames 映射,但如果有更优雅/高效的解决方案,我会很高兴。

我也在调查listarrays package

提前致谢

【问题讨论】:

标签: r arrays


【解决方案1】:

我也没有找到直接从数组中获取 dimnames 的简单方法。转换数据结构的一种简单方法是使用 dplyr 中的 as_tbl_cube 并将其转换为 data.frame(或 data.table)以查看 dimnames:

set.seed(3)
array_dim <- c(2,5,5,4)
array_fill <- runif(prod(array_dim))
array_dimnames <- list(
    dim1=c('strawberry', 'blackberry'),
    dim2=c('cranberry', 'banana', 'pineapple', 'apple', 'tangerine'), 
    dim3=c('orange', 'blueberry', 'kiwi', 'grapes', 'guava'),
    dim4=c('plum', 'fig', 'grapefruit', 'lemon')
)
fruits <- array(array_fill, dim=array_dim, dimnames=array_dimnames)
which(fruits %in% fruits[fruits>0.9], arr.ind = TRUE)
#>  [1]  28  54  56  73  74  85  90 115 161 198
fruits[198]
#> [1] 0.9065314

library(dplyr)
arr.cube <- as.tbl_cube(fruits)
tail(as.data.frame(arr.cube))
#>           dim1      dim2  dim3  dim4    fruits
#> 195 strawberry pineapple guava lemon 0.7057146
#> 196 blackberry pineapple guava lemon 0.3907374
#> 197 strawberry     apple guava lemon 0.8242374
#> 198 blackberry     apple guava lemon 0.9065314
#> 199 strawberry tangerine guava lemon 0.4171170
#> 200 blackberry tangerine guava lemon 0.2791320

在本例中,fruits[198] 的名称为黑莓、苹果、番石榴和柠檬。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-21
    • 2021-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多