从Vector执行顺序操作创建三角矩阵

ju.*_*yom 6 conditional for-loop r vector matrix

我一直在努力解决以下问题.

假设我有以下向量:

aux1<-c(0,0,0,4,5,0,7,0,0,10,11,12) 其中数字代表行的编号.

我想计算固定第一个组件的这个向量的不同元素之间的距离,然后是第二个组件,依此类推.

如果元素为零,我不想计算它,所以我改为NA.我想要的输出应该如下所示:

NA  NA  NA  NA  NA
NA  NA  NA  NA  NA
NA  NA  NA  NA  NA
NA  NA  NA  NA  NA
1   NA  NA  NA  NA
NA  NA  NA  NA  NA
3   2   NA  NA  NA
NA  NA  NA  NA  NA
NA  NA  NA  NA  NA
6   5   3   NA  NA
7   6   4   1   
8   7   5   2   1
Run Code Online (Sandbox Code Playgroud)

在第一列中,我有不同于零的第一个元素和所有其他元素之间的差异,即Matrix [5,1] = 5-4 = 1和Matrix [12,1] = 12-4 = 8.此外,Matrix [7,2] = 7-5 = 2,其中5是向量中的第二个元素,不等于零.请注意,Matrix [10,3] = 10-7 = 3,其中7是第三个元素不等于零,但是我的向量中的第七个元素.

我试图在循环中这样做.我当前的代码如下所示:

M=matrix(nrow=N-1, ncol=N-1))

for (i in 1:N-1){
  for (j in 1:N-1){
    if(j<=i)
      next
    else
      if(aux1[j]>0)
      M[j,i]=aux1[j]-aux1[i]
      else
        M[j,i]=0
  }
}
Run Code Online (Sandbox Code Playgroud)

不幸.我无法解决我的问题.任何帮助将不胜感激.

ags*_*udy 1

使用sapplyifelse

sapply(head(vv[vv>0],-1),function(y)ifelse(vv-y>0,vv-y,NA))
Run Code Online (Sandbox Code Playgroud)

您循环遍历正值(您还应该删除最后一个元素),然后从原始向量中提取每个值。我曾经ifelse用负值来代替。

#       [,1] [,2] [,3] [,4] [,5]
#  [1,]   NA   NA   NA   NA   NA
#  [2,]   NA   NA   NA   NA   NA
#  [3,]   NA   NA   NA   NA   NA
#  [4,]   NA   NA   NA   NA   NA
#  [5,]    1   NA   NA   NA   NA
#  [6,]   NA   NA   NA   NA   NA
#  [7,]    3    2   NA   NA   NA
#  [8,]   NA   NA   NA   NA   NA
#  [9,]   NA   NA   NA   NA   NA
# [10,]    6    5    3   NA   NA
# [11,]    7    6    4    1   NA
# [12,]    8    7    5    2    1
Run Code Online (Sandbox Code Playgroud)