r语言 - Diff 函数在与应用于行时转置矩阵



我需要找到矩阵中列之间的差异。diff()函数将使用矩阵来表示每列的行之间的差异,但我需要每行的列之间的差异。我尝试在行索引上使用带有diff()apply(),但这返回了一个转置的结果。为什么它会返回转置,我是否使用不正确?

# make a small sample matrix
m <- matrix(seq(1, 20, by = 1), nrow = 2, ncol = 10)
# apply the diff function to the rows, I expect a 2 by 10 matrix here, should I just transpose it?
apply(m, 1, diff)
[,1] [,2]
[1,]    2    2
[2,]    2    2
[3,]    2    2
[4,]    2    2
[5,]    2    2
[6,]    2    2
[7,]    2    2
[8,]    2    2
[9,]    2    2

详细说明apply的"转置效果":

根据?applyapply将一个函数应用于数组(例如matrix(的行向量(MARGIN = 1(或列向量(MARGIN = 2(并返回

维度 'c(n, dim(X([MARGIN](' 的数组,如果 'n> 1'

其中 n 是函数对行或列向量的单独调用返回的向量的长度。

所以在你的例子中dim(m)2 10(即2x10矩阵(和MARGIN = 1,所以返回对象的数组维数是9 2,这意味着一个9x2矩阵(因为diff返回长度为n=9的向量(。

当你这样做时,你可以看到相同的"转置效果">

apply(m, 1, c)
#      [,1] [,2]
# [1,]    1    2
# [2,]    3    4
# [3,]    5    6
# [4,]    7    8
# [5,]    9   10
# [6,]   11   12
# [7,]   13   14
# [8,]   15   16
# [9,]   17   18
#[10,]   19   20

如果让您感到困惑的只是格式9 2而不是2 9,那么您是对的,只需转置它。

因为您已经很好地计算了列的差异,即

for(k in 1:nrow(m)) diff(m[k,])

产生您已经拥有的正是。一个简单的t(apply(m, 1, diff))就可以了。

> t(apply(m, 1, diff))
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9]
[1,]    2    2    2    2    2    2    2    2    2
[2,]    2    2    2    2    2    2    2    2    2

PS您无法获得10 2/2 10结构,diff因为它显然会返回大小为n - 1的元素。

最新更新