与应用于行一起使用时,Diff 函数转置矩阵

Diff function transposes matrix when used with apply over rows

我需要找出矩阵中各列之间的差异。 diff() 函数将使用矩阵处理每列的行之间的差异,但我需要每行的列之间的差异。我尝试在行索引上使用 apply()diff(),但这个 return 是一个转置结果。为什么它 return 转置,我是不是用错了?

# 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的"transpose effect":

根据?applyapply 将函数应用于数组的行向量 (MARGIN = 1) 或列向量 (MARGIN = 2)(例如 matrix) 和 returns

an array of dimension ‘c(n, dim(X)[MARGIN])’ if ‘n > 1’

其中 n 是向量的长度 return 通过对行向量或列向量的函数的单独调用编辑。

因此在您的情况下 dim(m)2 10(即 2x10 矩阵)和 MARGIN = 1,因此 return 对象的数组维度是9 2,这意味着一个 9x2 矩阵(因为 diff return 是一个长度为 n=9 的向量)。

你可以看到相同的 "transpose effect" 当你这样做时

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 显然会 return 大小为 n - 1.

的元素