我有一个2D矩阵,我想转换成一个3D数组,但我没有得到正确的转换。
我的目标是让它工作,这样,不管我有多少第三维的水平,它都将递归地工作。
以下是数据:
dfs <- (structure(c(-0.046, 0.676, -0.698, -0.047, 0.719, -0.646, -0.044,
0.706, -0.667, 0.046, 0.769, -0.605, 0.047, 0.813, -0.551, 0.044,
0.795, -0.578), dim = c(9L, 2L), dimnames = list(c("snatch:(Intercept)",
"snatch:weight", "snatch:age", "clean:(Intercept)", "clean:weight",
"clean:age", "total:(Intercept)", "total:weight", "total:age"
), c("2.5 %", "97.5 %"))))
我要找的是这样的东西
$a
X2.5% X97.5%
(Intercept) -0.046 0.046
weight 0.676 0.769
age -0.698 -0.605
$b
X2.5% X97.5%
(Intercept) -0.047 0.047
weight 0.719 0.813
age -0.646 -0.551
$c
X2.5% X97.5%
(Intercept) -0.044 0.044
weight 0.706 0.795
age -0.667 -0.578
我的剧本和我目前所做的
rnames <- c("(Intercept)", "snatch", "age")
cnames <- colnames(dfs); cnames
lnames <- c("a", "b", "c"); lnames
array(
data = matrix(data = type.convert(gsub("^[^:]+:\\s*", "", dfs), as.is=TRUE),
nrow=nrow(dfs), ncol=ncol(dfs)),
dim = c(nrow(dfs)/length(lnames), length(cnames), length(lnames)),
dimnames = list(rows=rnames,
column=cnames,
level=lnames)) %>%
apply(., 2, data.frame)
4条答案
按热度按时间jxct1oxe1#
你可以尝试
split.data.frame
,例如,rks48beu2#
我们可以
t
转置2D矩阵(或者在您的情况下是数据.frame),制作一个array
,其中包含维度、列数、唯一前缀数和唯一后缀数(在本例中为c(2, 3, 3)
),然后使用aperm
转置数组。为了不使用硬编码,我们可以使用
dimnames
来获取维度的值以及结果数组的dimnames
。oug3syen3#
我知道这一个是冗长的,老实说,jay.sf和ThomasIsCoding的两个答案肯定更好,但找到一个tidyverse方法很有趣,我发现了
abind()
函数:kcrjzv8t4#
这是你想要的代码:
和输出:
classa是list