必须有一种优雅的方式来做到这一点,但我无法弄明白:
列是从右到右的1到0的概率
行是从0到1的概率下降
这个kludgy代码产生了看到所需的结果(但我想用比这更大的矩阵):
# Vector entries are rowname - colname, if >= 0
#
rb0 <- c(NA,NA,NA,NA,NA,NA,NA,NA,NA,NA, 0)
rb1 <- c(NA,NA,NA,NA,NA,NA,NA,NA,NA, 0,.1)
rb2 <- c(NA,NA,NA,NA,NA,NA,NA,NA, 0,.1,.2)
rb3 <- c(NA,NA,NA,NA,NA,NA,NA, 0,.1,.2,.3)
rb4 <- c(NA,NA,NA,NA,NA,NA, 0,.1,.2,.3,.4)
rb5 <- c(NA,NA,NA,NA,NA, 0,.1,.2,.3,.4,.5)
rb6 <- c(NA,NA,NA,NA, 0,.1,.2,.3,.4,.5,.6)
rb7 <- c(NA,NA,NA, 0,.1,.2,.3,.4,.5,.6,.7)
rb8 <- c(NA,NA, 0,.1,.2,.3,.4,.5,.6,.7,.8)
rb9 <- c(NA, 0,.1,.2,.3,.4,.5,.6,.7,.8,.9)
rb10 <- c( 0,.1,.2,.3,.4,.5,.6,.7,.8,.9,1 )
indbias <- rbind(rb0,rb1,rb2,rb3,rb4,rb5,rb6,rb7,rb8,rb9,rb10)
colnames(indbias) <- seq(1,0,by=-.1)
rownames(indbias) <- seq(0,1,by=.1)
indbias
Run Code Online (Sandbox Code Playgroud)
谢谢!
42-*_*42- 19
mat <- matrix(NA, 10,10)
mat[row(mat)+col(mat) >=11] <- (row(mat)+col(mat) -11)[row(mat)+col(mat)>=11]/10
mat
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,] NA NA NA NA NA NA NA NA NA 0.0
[2,] NA NA NA NA NA NA NA NA 0.0 0.1
[3,] NA NA NA NA NA NA NA 0.0 0.1 0.2
[4,] NA NA NA NA NA NA 0.0 0.1 0.2 0.3
[5,] NA NA NA NA NA 0.0 0.1 0.2 0.3 0.4
[6,] NA NA NA NA 0.0 0.1 0.2 0.3 0.4 0.5
[7,] NA NA NA 0.0 0.1 0.2 0.3 0.4 0.5 0.6
[8,] NA NA 0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.7
[9,] NA 0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8
[10,] 0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9
Run Code Online (Sandbox Code Playgroud)
我认为这将比plyr解决方案快得多,我碰巧认为它更容易理解.它基本上为右下角"三角形"中的条目设置测试,然后将"测试"矩阵bu 10的结果分开.您可以使用以下代码查看测试矩阵:
row(mat)+col(mat) -11
Run Code Online (Sandbox Code Playgroud)
编辑:我认为有可能将矩阵作为sebastian-c进行说明,然后进行单个测试来进行NA设置可能会更快(调用row和的调用数量的三分之一col)但它似乎只有三分之一快速.看起来两个seq调用比额外调用花费更多时间:
mat <- round(outer(seq(-0.5, 0.5, 0.1), seq(-0.5, 0.5, 0.1), `+`), 1)
is.na(mat) <- row(mat)+col(mat) <= 11
mat
Run Code Online (Sandbox Code Playgroud)
我找到了另一种基于鲜为人知的embed功能的解决方案:
mat <- embed(seq(-1,1, by=0.1), 11 )[,11:1]
is.na(mat) <- row(mat)+col(mat) <= 11
Run Code Online (Sandbox Code Playgroud)
虽然它比新解决方案快50%,但它仍然比原始解决方案慢.
seb*_*n-c 10
一个稍微不同的解决方案,与@ DWin的风格接近:
使用适当的下三角形创建一个矩阵(我不认为舍入是严格必要的,否则浮点错误会使它看起来很糟糕):
mat <- round(outer(seq(-0.5, 0.5, 0.1), seq(-0.5, 0.5, 0.1), `+`), 1)
mat
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11]
[1,] -1.0 -0.9 -0.8 -0.7 -0.6 -0.5 -0.4 -0.3 -0.2 -0.1 0.0
[2,] -0.9 -0.8 -0.7 -0.6 -0.5 -0.4 -0.3 -0.2 -0.1 0.0 0.1
[3,] -0.8 -0.7 -0.6 -0.5 -0.4 -0.3 -0.2 -0.1 0.0 0.1 0.2
[4,] -0.7 -0.6 -0.5 -0.4 -0.3 -0.2 -0.1 0.0 0.1 0.2 0.3
[5,] -0.6 -0.5 -0.4 -0.3 -0.2 -0.1 0.0 0.1 0.2 0.3 0.4
[6,] -0.5 -0.4 -0.3 -0.2 -0.1 0.0 0.1 0.2 0.3 0.4 0.5
[7,] -0.4 -0.3 -0.2 -0.1 0.0 0.1 0.2 0.3 0.4 0.5 0.6
[8,] -0.3 -0.2 -0.1 0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.7
[9,] -0.2 -0.1 0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8
[10,] -0.1 0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9
[11,] 0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0
Run Code Online (Sandbox Code Playgroud)
反转列
mat <- mat[,rev(seq.int(ncol(mat)))]
Run Code Online (Sandbox Code Playgroud)
删除上三角形:
mat[upper.tri(mat)] <- NA
Run Code Online (Sandbox Code Playgroud)
重新反转列:
mat <- mat[,rev(seq_len(ncol(mat)))]
mat
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11]
[1,] NA NA NA NA NA NA NA NA NA NA 0.0
[2,] NA NA NA NA NA NA NA NA NA 0.0 0.1
[3,] NA NA NA NA NA NA NA NA 0.0 0.1 0.2
[4,] NA NA NA NA NA NA NA 0.0 0.1 0.2 0.3
[5,] NA NA NA NA NA NA 0.0 0.1 0.2 0.3 0.4
[6,] NA NA NA NA NA 0.0 0.1 0.2 0.3 0.4 0.5
[7,] NA NA NA NA 0.0 0.1 0.2 0.3 0.4 0.5 0.6
[8,] NA NA NA 0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.7
[9,] NA NA 0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8
[10,] NA 0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9
[11,] 0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0
Run Code Online (Sandbox Code Playgroud)
您可以从那里更改rownames.
编辑:鉴于有这么多解决方案,您可能有兴趣看看他们如何进行基准测试.使用microbenchmark:
Unit: microseconds
expr min lq median uq max
1 AGS() 682.491 738.9370 838.0955 892.8815 4518.740
2 DW() 23.244 27.1680 31.3930 34.8650 70.937
3 MvG() 15469.664 15920.4820 17352.3215 17827.4380 18989.270
4 SC() 118.629 131.4575 144.1360 157.7190 631.779
Run Code Online (Sandbox Code Playgroud)
@DWin的解决方案似乎是最快的.
一种可能的方法,使用我当前最喜欢的库:
library(plyr)
daply(expand.grid(x=seq(1,0,-.1), y=seq(0,1,.1)),
.(y, x), with,
if (x+y >= 1) x+y-1 else NA)
Run Code Online (Sandbox Code Playgroud)
这给出了以下结果:
x
y 0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1
0 NA NA NA NA NA NA NA NA NA NA 0.0
0.1 NA NA NA NA NA NA NA NA NA 0.0 0.1
0.2 NA NA NA NA NA NA NA NA 0.0 0.1 0.2
0.3 NA NA NA NA NA NA NA 0.0 0.1 0.2 0.3
0.4 NA NA NA NA NA NA 0.0 0.1 0.2 0.3 0.4
0.5 NA NA NA NA NA 0.0 0.1 0.2 0.3 0.4 0.5
0.6 NA NA NA NA 0.0 0.1 0.2 0.3 0.4 0.5 0.6
0.7 NA NA NA 0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.7
0.8 NA NA 0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8
0.9 NA 0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9
1 0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0
Run Code Online (Sandbox Code Playgroud)
想法是expand.grid创建所有可能的单元格值的数据框.你也可以用merge它.然后,将函数应用于每个值以计算单元格内容.并daply把它变成一个很好的矩阵,包括名字.
编辑:
好的,你想要以相反的顺序标记列.ddply将它们升序排序.试试这个:
daply(expand.grid(x=seq(0,1,.1), y=seq(0,1,.1)),
.(y, x), with,
if (y-x >= 0) y-x else NA)[,11:1]
Run Code Online (Sandbox Code Playgroud)
x
y 1 0.9 0.8 0.7 0.6 0.5 0.4 0.3 0.2 0.1 0
0 NA NA NA NA NA NA NA NA NA NA 0.0
0.1 NA NA NA NA NA NA NA NA NA 0.0 0.1
0.2 NA NA NA NA NA NA NA NA 0.0 0.1 0.2
0.3 NA NA NA NA NA NA NA 0.0 0.1 0.2 0.3
0.4 NA NA NA NA NA NA 0.0 0.1 0.2 0.3 0.4
0.5 NA NA NA NA NA 0.0 0.1 0.2 0.3 0.4 0.5
0.6 NA NA NA NA 0.0 0.1 0.2 0.3 0.4 0.5 0.6
0.7 NA NA NA 0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.7
0.8 NA NA 0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8
0.9 NA 0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9
1 0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0
Run Code Online (Sandbox Code Playgroud)
require(matlab)
x=matrix(seq(0,1,.1),1)
X=x[rep(1,c(11)),]
X[upper.tri(X)]=NA
X=t(X)
for(a in 1:11){
X[1:a,a]=rev(X[1:a,a])
}
X=flipud(X)
colnames(X) <- seq(1,0,by=-.1)
rownames(X) <- seq(0,1,by=.1)
Run Code Online (Sandbox Code Playgroud)