2011-03-15 3 views
6
나는 일반 텍스트에 다음과 같은 형식으로 LISREL에 의해 작성된 분산 - 공분산 행렬에 읽으려고하고

하여 벡터로 낮은 행렬을 채우기 공백이 구분 된 파일 :행, 열이 아닌

0.23675E+01 0.86752E+00 0.28675E+01 -0.36190E+00 -0.36190E+00 0.25381E+01 
-0.32571E+00 -0.32571E+00 0.84425E+00 0.25598E+01 -0.37680E+00 -0.37680E+00 
0.53136E+00 0.47822E+00 0.21120E+01 -0.37680E+00 -0.37680E+00 0.53136E+00 
0.47822E+00 0.91200E+00 0.21120E+01 

이가 실제로 하대 각 행렬 (대각 포함)

0.23675E+01 
0.86752E+00 0.28675E+01 
-0.36190E+00 -0.36190E+00 0.25381E+01 
-0.32571E+00 -0.32571E+00 0.84425E+00 0.25598E+01 
-0.37680E+00 -0.37680E+00 0.53136E+00 0.47822E+00 0.21120E+01 
-0.37680E+00 -0.37680E+00 0.53136E+00 0.47822E+00 0.91200E+00 0.21120E+01 

I 올바르게 scan() 또는 read.table(fill=T)로 값을 읽을 수있다.

그러나 나는 매트릭스에 정확하게 read-in vector를 저장할 수 없다. 다음 코드

S <- diag(6) 
S[lower.tri(S,diag=T)] <- d 

은 열을 기준으로 하단 행을 채우지 만 행을 채워야합니다.

matrix()을 사용하면 byrow=TRUE 옵션을 사용할 수 있지만 아래쪽 절반 (대각선)이 아니라 전체 매트릭스가 채워집니다.

둘 다 가질 수 있습니까? 하단 행렬 (대각선) 만 채우십시오 행별로 수행 하시겠습니까?

(별도의 문제가 나는 데 :. LISREL 사용하는 'D + 01'R은 인식하면서 'E는 + 01'과학적 표기법에 대한 당신은 또한 'D'를 받아 R에서 변경할 수 있습니까?)

답변

10

을 그냥 읽어

S <- diag(6) 
S[upper.tri(S, diag=TRUE)] <- d 
t(S) 
아래의 위 삼각형 부분에 입력하십시오.
2

foo <- read.moments() 
0.23675E+01 
0.86752E+00 0.28675E+01 
-0.36190E+00 -0.36190E+00 0.25381E+01 
-0.32571E+00 -0.32571E+00 0.84425E+00 0.25598E+01 
-0.37680E+00 -0.37680E+00 0.53136E+00 0.47822E+00 0.21120E+01 
-0.37680E+00 -0.37680E+00 0.53136E+00 0.47822E+00 0.91200E+00 0.21120E+01 

foo[upper.tri(foo)] <- t(foo)[upper.tri(foo)] 

이 당신에게 제공합니다 :

  X1  X2  X3  X4  X5  X6 
X1 2.36750 0.86752 -0.36190 -0.32571 -0.37680 -0.37680 
X2 0.86752 2.86750 -0.36190 -0.32571 -0.37680 -0.37680 
X3 -0.36190 -0.36190 2.53810 0.84425 0.53136 0.53136 
X4 -0.32571 -0.32571 0.84425 2.55980 0.47822 0.47822 
X5 -0.37680 -0.37680 0.53136 0.47822 2.11200 0.91200 
X6 -0.37680 -0.37680 0.53136 0.47822 0.91200 2.11200 

,691,363 sem 패키지는 그냥 할 수 있도록 설계되었습니다 아주 좋은 기능, read.moments()있다 (210)

EDIT1 :이 원래 낮은 삼각형으로 인쇄 된 이유만으로 scan(),의 문제에 관해서는 당신이 낮은 삼각형에 넣어 것은 아닙니다 :) 그냥 상단에 넣어 :

foo <- scan() 
0.23675E+01 
0.86752E+00 0.28675E+01 
-0.36190E+00 -0.36190E+00 0.25381E+01 
-0.32571E+00 -0.32571E+00 0.84425E+00 0.25598E+01 
-0.37680E+00 -0.37680E+00 0.53136E+00 0.47822E+00 0.21120E+01 
-0.37680E+00 -0.37680E+00 0.53136E+00 0.47822E+00 0.91200E+00 0.21120E+01 

bar <- matrix(0,6,6) 

bar[upper.tri(bar,diag=TRUE)] <- foo 

bar[lower.tri(bar)] <- t(bar)[lower.tri(bar)] 

EDIT2 : 내가 제대로 이해한다면 D 표기법의 문제에 관해서는, E에, 제 1 주사 문자로 gsub는 D를 고정 할 수 있으며 숫자로 강제 :

foo <- scan(what="character") 
0.23675D+01 
0.86752D+00 0.28675D+01 
-0.36190D+00 -0.36190D+00 0.25381D+01 
-0.32571D+00 -0.32571D+00 0.84425D+00 0.25598D+01 
-0.37680D+00 -0.37680D+00 0.53136D+00 0.47822D+00 0.21120D+01 
-0.37680D+00 -0.37680D+00 0.53136D+00 0.47822D+00 0.91200D+00 0.21120D+01 


bar <- matrix(0,6,6) 

bar[upper.tri(bar,diag=TRUE)] <- as.numeric(gsub("D","E",foo)) 

bar[lower.tri(bar)] <- t(bar)[lower.tri(bar)] 

bar