我在以下数据结构中有四个完整的信号。我想将每个信号分成360块或靠近它。
当前数据结构[1:541650, 1:4]
,其中四个长度为541650的信号,我想转换为数据结构[1:360, 1:4*1505]
或类似的地方,我为数据结构创建了多余的空格,因为1:4*1504
会丢失一些尾点
>>> 541650*4.0
2166600.0
>>> 360*1505*4
2167200.0
R
中的当前数据结构,当前代码及其内容m1 <- matrix(1:541650, ncol=4, nrow=541650); str(m1)
#int [1:541650, 1:4] 1 2 3 4 5 6 7 8 9 10 ...
#case: num [1:541650, 1:4] -0.675 -0.67 -0.67 -0.65 -0.65 -0.6 -0.555 -0.535 -0.52 -0.515 ...
测试当前数据结构的功能:M.ecg.cor <- cor(M.ecg)
电流输出:4x4矩阵
代码
# https://stackoverflow.com/q/40429343/54964
library("corrgram")
set.seed(24)
A=541650
m1 <- matrix(1:A, ncol=4, nrow=A)
a=360; b=1505; c=4;
# https://stackoverflow.com/a/40430229/54964
m2 <- array(`length<-`(m1, a*b*c), dim = c(a,b,c))
res <- lapply(seq(dim(m2)[3]), function(i) cor(m2[,,i]))
str(res)
res2 <- lapply(res, function(x) eigen(replace(x, is.na(x), 0))$vectors[,1:2])
str(res2)
res2 <- do.call(rbind, res2) # a single matrix
dim(res2) # 6020 2
# Not Passed because output strange
corrgram(res2,
upper.panel=panel.pie,
lower.panel=panel.shade,
text.panel=panel.txt,
order=NULL,
diag.panel=panel.minmax)
输出,图1输出仅为1x1矩阵
List of 4
$ : num [1:1505, 1:1505] 1 1 1 1 1 1 1 1 1 1 ...
$ : num [1:1505, 1:1505] 1 1 1 1 1 1 1 1 1 1 ...
$ : num [1:1505, 1:1505] 1 1 1 1 1 1 1 1 1 1 ...
$ : num [1:1505, 1:1505] 1 1 1 1 1 1 1 1 1 1 ...
List of 4
$ : num [1:1505, 1:2] -0.0258 -0.0258 -0.0258 -0.0258 -0.0258 ...
$ : num [1:1505, 1:2] -0.0258 -0.0258 -0.0258 -0.0258 -0.0258 ...
$ : num [1:1505, 1:2] -0.0258 -0.0258 -0.0258 -0.0258 -0.0258 ...
$ : num [1:1505, 1:2] -0.0258 -0.0258 -0.0258 -0.0258 -0.0258 ...
[1] 6020 2
预期输出:6020x6020矩阵
R:3.3.1
操作系统:Debian 8.5
答案 0 :(得分:1)
一种选择是转换为array
,但array
只能包含固定尺寸。因此,如果我们缺少元素数量,请在末尾添加一些NA,然后转换为3D数组。
m2 <- array(`length<-`(m1, 30), dim = c(2,5,3))
然后apply
将MARGIN
指定为3。
res <- apply(m2, 3, FUN = function(x) list(cor(x)))
identical(res[[1]][[1]], cor(m2[,,1]))
#[1] TRUE
或另一种选择是使用lapply
遍历第三维并应用cor
res2 <- lapply(seq(dim(m2)[3]), function(i) cor(m2[,,i]))
set.seed(24)
m1 <- matrix(rnorm(45), ncol=5, nrow=9)