我一直在努力解决以下问题。
假设我有以下向量:
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
在第一列中,我有不同于零的第一个元素和所有其他元素之间的差异,即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
}
}
不幸的是。我无法解决我的问题。任何帮助将不胜感激。
答案 0 :(得分:3)
您可以尝试以下内容(在@thela的慷慨帮助下)
res <- outer(aux1, head(aux1[aux1 > 0], -1), `-`)
is.na(res) <- res <= 0
# [,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
答案 1 :(得分:1)
使用sapply
和ifelse
:
sapply(head(vv[vv>0],-1),function(y)ifelse(vv-y>0,vv-y,NA))
循环显示正值(您还应删除最后一个元素),然后从原始矢量中提取每个值。我使用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