将“delta”列添加到矩阵中,包含每个相邻列中元素之间的差值?

时间:2014-05-29 14:52:35

标签: r matrix diff

我是R的新手,试图对声音文件中的数据进行一些分析。我已经知道如何将我的记录转换为测量(光谱能量),如何将这些测量结果导入R矩阵,以及如何将该矩阵融化成列。但我坚持中间步骤。当我创建测量数据矩阵时,每个矩阵是12列乘360行。我需要做的是创建新的矩阵,其中包含每个原始12列之间的“Delta”(更改)值。所以例如如果我的原始矩阵是

[,1]     [,2]   [,3]
1        2      3
2        4      6
3        6      9
4        8      12

我需要得到一个派生矩阵:

[,1]    [,2]-[,1]     [,2]   [,3]-[,2]     [,3]
1           1         2          1         3
2           2         4          2         6
etc.

我可以使用简单的矩阵减法制作单独的差异列,如

coldif1<-X[,2] - X[,1]

但我无法弄清楚如何创建我需要的结果矩阵。交错差异列非常重要,因为最后我需要融化(X)将整个事物转换为单个堆叠列,其值依次为:

[,1]
[,2]-[,1]
[,2]
[,3]-[,2]
[,3]
etc.

有直接的方法吗?

2 个答案:

答案 0 :(得分:0)

一种方式可能是:

set.seed(11); mat = matrix(sample(12), 4, 3)
#> mat
#     [,1] [,2] [,3]
#[1,]    4    9   12
#[2,]    1    7   10
#[3,]    6    8    3
#[4,]   11    2    5
tmp = mat[, -1] - mat[, -ncol(mat)]
#> tmp
#     [,1] [,2]
#[1,]    5    3
#[2,]    6    3
#[3,]    2   -5
#[4,]   -9    3
cbind(mat, tmp)[, order(c(seq_len(ncol(mat)), seq_len(ncol(tmp))))]
#     [,1] [,2] [,3] [,4] [,5]
#[1,]    4    5    9    3   12
#[2,]    1    6    7    3   10
#[3,]    6    2    8   -5    3
#[4,]   11   -9    2    3    5

答案 1 :(得分:0)

这是一组简单的base命令,它们将推广到任意数量的列和行:

# Your data
m <- matrix( c( 1:4 , seq(2,8,2),seq(3,12,3)),4 , byrow = F)

# Differences between columns
md <- t( apply( m , 1 , diff ) )

# Add column of NA to result to make it same size as input matrix
md <- cbind(md,NA)

# Join matrices
out <- rbind( m , md )

# Reshape to get your result
out <- matrix( c(out[ ! is.na(out) ] ) , nrow = nrow(m) , byrow = F )
#     [,1] [,2] [,3] [,4] [,5]
#[1,]    1    1    2    1    3
#[2,]    2    2    4    2    6
#[3,]    3    3    6    3    9
#[4,]    4    4    8    4   12