我是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.
有直接的方法吗?
答案 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