2017-06-22 18 views
1

私は3つの異なるスケール(各10個)を構成する30個の変数を持つデータセットを持っています。Rでは、各サブテストの相関行列を見つける

C1 C2 A1 A2 N1 N2 
C1 1 .36 0 0 0 0 
C2 .36 1 0 0 0 0 
A1 0 0 1 .50 0 0 
A2 0 0 .50 1 0 0 
N1 0 0 0 0 1 .41 
N2 0 0 0 0 .41 1 

私の目標:小規模な例を考えると、私はこれまで、このから相関行列をとる(y'allのからの助けを借りて)機能...

C1 C2 A1 A2 N1 N2 
C1 1 .36 .64 .47 .36 .43 
C2 .36 1 .27 .43 .40 .47 
A1 .64 .27 1 .50 .49 .33 
A2 .47 .43 .50 1 .47 .37 
N1 .36 .40 .49 .47 1 .41 
N2 .43 .47 .33 .37 .41 1 

を...書きました3つの行列を含むリストに(3つの異なるスケールのそれぞれに基づいて)この相関行列を格納することです。最終的な出力は次のようになります。

'1' 
    C1 C2 
C1 1 .36 
C2 .36 1 

'2' 
    A1 A2 
A1 1 .50 
A2 .50 1 

'3' 
    N1 N2 
N1 1 .41 
N2 .41 1 

私はforループを実行し、結果をリストに格納するのが最も良いと思います。悲しいことに、私はどこで始めるのかについて空白を描いています。しかし、重要なことは、上記の結果を生成するコードが、2つ、3つ(このインスタンスのような)、4つ以上のサブスケールを含むデータセットで利用できることです。

追加する追加情報があります。以下は、行列の値を0に置き換える関数です。変数のパラメータは次のとおりです。

num.vars <- 6; num.subscales <- 3; cor.d <- is the table from above 

# Find correlation matrix of each sub-test 
temp <- seq(1, num.vars, 1) 
temp.factors <- split(temp, cut(temp, num.subscales, labels=FALSE)) 
temp.names <- names(d) 

temp.factors <- lapply(temp.factors, function(x) temp.names[x]) 

facReplace <- function(m, f) { 
    x <- do.call("c", f) 
    m1 <- data.frame(m) 
    row.names(m1) <- x 
    names(m1) <- x 
    for (i in 1:length(f)) { 
    for (j in 1:length(x)) { 
     for (k in 1:length(x)) { 
     tempfac <- do.call("c", f[i]) 
     temprow <- x[j] 
     tempcol <- x[k] 
     if (!(temprow %in% tempfac) & (tempcol %in% tempfac)) (m1[j, k] <- 0) 
     } 
    } 
    } 
    return(m1) 
} 
sub.cor.matrix <- as.matrix(facReplace(cor.d, temp.factors)) 

答えて

2

これを実行しようとしていますか?

scales_nameは、末尾の数字を削除して一意のスケール属性を取得します。あなただけのサブセットとこれは完璧なソリューションですdata.frame

> df <- read.table(text = " C1 C2 A1 A2 N1 N2 
+ C1 1 .36 .64 .47 .36 .43 
+   C2 .36 1 .27 .43 .40 .47 
+   A1 .64 .27 1 .50 .49 .33 
+   A2 .47 .43 .50 1 .47 .37 
+   N1 .36 .40 .49 .47 1 .41 
+   N2 .43 .47 .33 .37 .41 1", header = TRUE, row.names = 1) 
> 
> scales_name <- unique(gsub("[:0-9:]", "", colnames(df))) 
> 
> list_cor_mat <- list() 
> for (scale_tmp in scales_name) { 
+ list_cor_mat <- c(list_cor_mat, 
+  list(df[grepl(scale_tmp,rownames(df)), grepl(scale_tmp,colnames(df))]) 
+ ) 
+ } 
> 
> names(list_cor_mat) <- scales_name 
> list_cor_mat 
$C 
    C1 C2 
C1 1.00 0.36 
C2 0.36 1.00 

$A 
    A1 A2 
A1 1.0 0.5 
A2 0.5 1.0 

$N 
    N1 N2 
N1 1.00 0.41 
N2 0.41 1.00 
+0

のリストを取得するにはdfを絞り込むことができます。ありがとう、raymkchow! – Josh

関連する問題