我需要找到矩阵中列之间的差异。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
的"转置效果":
根据?apply
,apply
将一个函数应用于数组(例如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
的元素。