与应用于行一起使用时,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":
根据?apply
,apply
将函数应用于数组的行向量 (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
.
的元素
我需要找出矩阵中各列之间的差异。 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":
根据?apply
,apply
将函数应用于数组的行向量 (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
.