R 编程语言?我更喜欢C,它更容易拼写。
一种方法是按照我喜欢的方式创建一个包含数字的矩阵:
a<-t(matrix(1:16,nrow=4,ncol=4))
看起来像:
[,1] [,2] [,3] [,4]
[1,] 1 2 3 4
[2,] 5 6 7 8
[3,] 9 10 11 12
[4,] 13 14 15 16
删除对角线上的值:
diag(a)=NA
结果是:
[,1] [,2] [,3] [,4]
[1,] NA 2 3 4
[2,] 5 NA 7 8
[3,] 9 10 NA 12
[4,] 13 14 15 NA
要真正删除这些值,而不是仅仅让它们消失,我们需要重新转换:
a<-t(matrix(t(a)[which(!is.na(a))],nrow=3,ncol=4))
结果是:
[,1] [,2] [,3]
[1,] 2 3 4
[2,] 5 7 8
[3,] 9 10 12
[4,] 13 14 15
这与我们在上面的 C 中得到的结果是一样的。
这有点迂回,但它产生了我认为正确的答案。我有兴趣看到比我更了解 R 的人提供的改进解决方案。
对作业的一些解释:
a<-t(matrix(t(a)[which(!is.na(a))],nrow=3,ncol=4))
- The
!is.na(a)
给我们一个 TRUE、FALSE 值的列表,其中元素被清空。
- The
which(!is.na(a))
为我们提供了每个真实元素的下标列表。
- The
t(a)
转置矩阵,因为我们需要根据 #2 中的下标进行拉取。
-
t(a)[which(!is.na(a))]
给我们一个缺少对角线 NA 值的数字列表。
-
matrix(t(a)[which(!is.na(a))],nrow=3,ncol=4)
将#4 中的列表转换为矩阵,这是我们想要的转置。
-
a<-t(matrix(1:16,nrow=4,ncol=4))
(整个事情)将 #5 转置为我们想要的形式并将其分配给a
多变的。
这适用于以下情况a<-t(matrix(11:26,nrow=4,ncol=4))
.