如何调整R中较小段的数据结构?

时间:2016-11-04 18:15:08

标签: r data-structures

我在以下数据结构中有四个完整的信号。我想将每个信号分成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矩阵

使用案例

测试akrun的answer

代码

# 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

enter image description here

预期输出:6020x6020矩阵

R:3.3.1
操作系统:Debian 8.5

1 个答案:

答案 0 :(得分:1)

一种选择是转换为array,但array只能包含固定尺寸。因此,如果我们缺少元素数量,请在末尾添加一些NA,然后转换为3D数组。

m2 <- array(`length<-`(m1, 30), dim = c(2,5,3)) 

然后applyMARGIN指定为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)