read.lower.tri <- function(file="", symmetric=FALSE)
{
elements <- scan(file=file, what="")
m <- length(elements)
n <- floor((sqrt(9+8*m)-3)/2)
if (m != n*(n+1)/2+n) {
stop("wrong number of elements (cannot make square matrix)")
}
x <- diag(n)
pos <- cumsum(1:n)
x[upper.tri(x, diag=TRUE)] <- as.numeric(elements[-pos])
colnames(x) <- rownames(x) <- elements[pos]
if (symmetric) {
x <- x+t(x)
diag(x) <- diag(x)/2
return(x)
}
else {
return(t(x))
}
}
( x <- read.lower.tri(symmetric=TRUE) )
SCAO 0.00
AOPR 0.91 0.00
ARPO 0.96 0.85 0.00
YOSA 0.86 0.94 0.94 0.00
ROAY 0.89 0.90 0.91 0.83 0.00
SORA 0.97 0.99 0.98 0.92 0.98 0.00
BJAO 0.90 0.91 0.95 0.92 0.89 0.85 0.00
上のような,行の名前を持つ下三角行列(対角成分を含む)を入力する関数を書いた。
第1引数に,ファイルから入力するならファイル名。デフォルトではコンソールから読む。コンソールから読むときは,関数の入力に続いてプロンプトに従って入力(どこかからコピーして,コンソールにペースト)する。空行で入力終了。
対称行列にしたければ,symmetric=TRUE にする。