将“delta”列添加到矩阵中,包含每个相邻列中元素之间的差异值?
Posted
技术标签:
【中文标题】将“delta”列添加到矩阵中,包含每个相邻列中元素之间的差异值?【英文标题】:Add “delta” columns to a matrix, containing the difference values between elements in each adjacent column? 【发布时间】:2014-07-19 03:08:28 【问题描述】:我是 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]
但我不知道如何创建我需要的结果矩阵。将差异列交错很重要,因为最后我需要使用 melt(X) 将整个内容转换为单个堆叠列,其中的值按顺序排列,如下所示:
[,1]
[,2]-[,1]
[,2]
[,3]-[,2]
[,3]
etc.
有没有直接的方法来做到这一点?
【问题讨论】:
【参考方案1】:一种方法可能是:
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
【讨论】:
谢谢亚历克西斯,这很好。我运行了这两个函数(下面是你的和西蒙的)并且都很好地解决了这个问题。我希望有一天我能达到你对 R 的熟练程度。【参考方案2】:这里有一组简单的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
【讨论】:
哇,这太棒了。我运行了演示(很明显,它有效,并阐明了每个步骤在做什么),然后用我的 336x12 矩阵之一进行了尝试。起初没有工作,但后来我发现我做错了什么,现在它工作得很好。非常感谢! @user3687834 很高兴这两个答案都有帮助。请您选择您最喜欢的并单击它旁边的绿色复选标记以表明您的问题已得到回答?太好了,谢谢!以上是关于将“delta”列添加到矩阵中,包含每个相邻列中元素之间的差异值?的主要内容,如果未能解决你的问题,请参考以下文章