2016-05-12 4 views
2

私は以下のようなデータフレームを持っています。私はRを使って2つの列を行列に渡しましたが、Rは私に行列を渡すことはできません。 (私の予想されるマトリックスは、約700 * 700である。)Rは立ち止まったと私はSASで同じことをしたいReached total allocation of 12213Mb: see help(memory.size)RとSASの2つのペアの列から相関行列を取得する方法は?対角がゼロです

示しています。どうすればそれをすることができますか?あるいはRでこれを完成させるために別のコードが必要ですか?

ID_r ID_c SCORE 
A1 A2 0.2 
A1 A3 0.2 
A1 A4 0.3 
A1 A5 0.2 
A1 A6 0.2 
A2 A3 0.6 
A2 A4 0.2 
A2 A5 0.2 
A2 A6 0.2 
A3 A4 0.2 
A3 A5 0.2 
A3 A6 0.2 
A4 A5 0.2 
A4 A6 0.9 
A5 A6 0.2 

    ID_r<-c('A1','A1','A1','A1','A1','A2','A2','A2','A2','A3','A3','A3','A4','A4','A5') 
    ID_c<-c('A2','A3','A4','A5','A6','A3','A4','A5','A6','A4','A5','A6','A5','A6','A6') 
    SCORE<-c(0.2,0.2,0.3,0.2,0.2,0.6,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.9,0.2) 

library(dplyr); library(tidyr) 
df$ID_r <- as.character(df$ID_r) 
df$ID_c <- as.character(df$ID_c) 
ID <- unique(c(df$ID_r, df$ID_c)) 
diagDf <- data.frame(ID_r = ID, ID_c = ID, SCORE = "0.0") 
newDf <- rbind(df, diagDf) %>% arrange(ID_r, ID_c) 

resultDf <- spread(newDf, ID_r, SCORE, fill = ".") 
names(resultDf)[1] <- "" 
resultDf 

サンプルSASデータは以下のとおりです。

data score_data; 
infile datalines; 
input ID_r $ ID_c $ SCORE; 
return; 
datalines; 

    A1 A2 0.2 
    A1 A3 0.2 
    A1 A4 0.3 
    A1 A5 0.2 
    A1 A6 0.2 
    A2 A3 0.6 
    A2 A4 0.2 
    A2 A5 0.2 
    A2 A6 0.2 
    A3 A4 0.2 
    A3 A5 0.2 
    A3 A6 0.2 
    A4 A5 0.2 
    A4 A6 0.9 
    A5 A6 0.2 
; 
run; 

proc print data=score_data ; 
run; 

そして、私は(diaginalがゼロである)以下のような行列を生成するために2つの列のデータを使用します。

A1 A2 A3 A4 A5 A6 
A1 0.0 0.2 0.2 0.3 0.2 0.2 
A2 0.2 0.0 0.6 0.2 0.2 0.2 
A3 0.2 0.6 0.0 0.2 0.2 0.2 
A4 0.3 0.2 0.2 0.0 0.2 0.9 
A5 0.2 0.2 0.2 0.2 0.0 0.2 
A6 0.2 0.2 0.2 0.9 0.2 0.0 

ありがとうございます!

答えて

2

Rソリューション:

library(plyr) 
ID_r = c('A1','A1','A1','A1','A1','A2','A2','A2','A2','A3','A3','A3','A4','A4','A5') 
ID_c = c('A2','A3','A4','A5','A6','A3','A4','A5','A6','A4','A5','A6','A5','A6','A6') 
SCORE = c(0.2,0.2,0.3,0.2,0.2,0.6,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.9,0.2) 
df1 = data.frame(ID_r, ID_c, SCORE) 
df2 = data.frame(ID_c, ID_r, SCORE) 
names(df2) = c("ID_r","ID_c","SCORE") 
df = rbind(df1,df2) 
ID <- unique(c(ID_r, ID_c)) 

df1 = expand.grid(ID,ID) 
names(df1) = c("ID_r","ID_c") 
d = join(df1, df, by = c("ID_r","ID_c")) 
d$SCORE[is.na(d$SCORE)] <- 0 

a = matrix(0, nrow = length(ID), ncol = length(ID)) 
rownames(a) <- ID 
colnames(a) <- ID 
a 

b = as.matrix(d) 
b 

a[b[,1:2]] <- b[,3] 
a 
+0

'join'は' plyr'パッケージを必要とします。 – Divi

+0

'join'はデフォルトで' left'型を使います。この問題であなたが必要としているものはどれですか。あなたはどんなエラーを出していますか? – Divi

+0

答えを編集しました。 – Divi

1

PROC TRANSPOSEはここにあなたの友達です。

proc transpose data=score_data out=score_matrix; 
    by id_r; 
    id id_c; *this makes variable names; 
    var score; 
run; 

これは、あなたに上の対角線を与えます。二proc transposeはあなたに(id_rid_c私が想像をスワップ)下の対角線を与えることができるか、データセットでそれを行うことができます。あなたはまだ6つの0.0行をデータセットに作成する必要がありますが、それは特に難しいことではありません。

これを実行する例:

data pre_transpose; 
    set score_data end=eof; 
    by id_r id_c; 
    output; 

    *Swap R and C; 
    _idtemp = id_r; 
    id_r=id_c; 
    id_c=_idtemp; 
    output; 

    *If EOF, then need that last 0,0 combo which never gets an R; 
    if eof then do; 
    id_c = id_r; 
    score=0; 
    output; 
    id_c = _idtemp; 
    end; 

    *If first line of a new ID, then need the R=C row; 
    if first.id_r then do; 
    id_r=id_c; 
    score=0; 
    output; 
    end; 

run; 

proc sort data=pre_transpose; 
    by id_r id_c; 
run; 
proc transpose data=pre_transpose out=score_matrix; 
    by id_r; 
    id id_c; *this makes variable names; 
    var score; 
run; 
+0

はありがとう!!!!それは完璧に動作します!!!!どうもありがとうございます。私はあなたの答えから多くのSASコーディングを学びます。 –

関連する問題