bounty还有4天到期。回答此问题可获得+100声望奖励。Ben Bolker希望吸引更多的注意力这个问题:这是stackoverflow.com/questions/75228268/…的一个同伴问题,但是矩阵的优雅答案在高维中不起作用。评论里有一些答案,可以清理一下贴出来或者有人能想出更好的...
假设我有一个三维数组g
,维度为[x,y,z]
。reshape2::melt(g)
将产生具有给出索引x,y,z
和value
的列的 Dataframe ,其中value
包含先前阵列的每个条目中的值。
假设reshape2
是superseded,那么在base R中是否有一个“one function”替代reshape2::melt
的功能,或者我缺少的一个更积极支持的tidyverse
包?reshape2
建议人们使用tidyr
,但我似乎无法在tidyr
中找到多维数组的解决方案。有cubelyr,但似乎也不是很活跃,这些天。
我可以编写一个自定义解决方案,只需要为这类问题寻找一个稳定的、具有reshape2::melt
简单功能的解决方案。
library(reshape2)
g_as_array <- array(rnorm(9), dim = c(3,3,3)) # create a 3D array
g_as_data_frame <- reshape2::melt(g_as_array) # melt down to "tidy" format
head(g_as_data_frame)
#> Var1 Var2 Var3 value
#> 1 1 1 1 1.4092362
#> 2 2 1 1 -2.1606972
#> 3 3 1 1 0.4334404
#> 4 1 2 1 0.2390544
#> 5 2 2 1 -0.9673617
#> 6 3 2 1 0.5668378
由reprex package(v2.0.1)于2022-08-25创建
4条答案
按热度按时间pbossiut1#
如果数组具有维名称:
如果并非所有维都有名称,则需要首先填写缺少的名称,例如:
bq8i3lrv2#
一个选项是使用
arrayInd
。或者类似于@ThomasIsCoding使用
which
。如果数组具有维度名称。
但这可以通过
as.data.frame(ftable(A))
@Jon Spring或as.data.frame.table(A)
@Onyambu来实现,如评论中所示。如果查看
as.data.frame.table
的源代码,您会发现它使用的是expand.grid
。但如果需要 * 数字索引 *,则可以使用此。
或者一个变体-感谢@Onyambu的提示!
另一种选择是使用
%%
和%/%
“手工”计算。或者使用
rep
。kkih6yb83#
下面是一些使用
which
技巧的R基替代方案,它们应该适用于一般数组,即数字和字符:which(1^is.na(g) > 0, arr.ind = TRUE)
which(TRUE | is.na(g), arr.ind = TRUE)
nchar(g, "width") > -1
我们将获得
虚拟数据
pbpqsu0x4#
对标,好玩而已
以下是针对不同维度的数组的一些有趣的基准测试观察结果(不考虑维度名称以进行简化),其中考虑了对所发布问题的多个现有解决方案。
下面是关于随机数组的维数参数的基准测试函数
1.对于
dim <- rep(5, 3)
,我们运行fbench(dims)
并获得1.对于
dims <- rep(5, 4)
,我们运行fbench(dims)
并获得1.对于
dims <- rep(5, 5)
,我们运行fbench(dims)
并获得1.对于
dims <- rep(5, 6)
,我们运行fbench(dims)
并获得1.对于
dims <- rep(5, 7)
,我们运行fbench(dims)
并获得1.对于
dims <- rep(5, 8)
,我们运行fbench(dims)
并获得