2017-05-23 14 views
0

私は相関係数とp係数を計算し、それらをそれぞれ2つのマトックスcormatとpmatに格納しました。forループ内のR内のdataframe/data.tableを更新する

スレッショルドを超える相関を検索してデータフレームに格納するコードを作成しました。このコードはありません

threshold <- 0 # Just to test the code 
for (i in (1 : (ncol(cormat) - 1))){ 
     for(j in ((i+1) : ncol(cormat))){ 
     if (cormat[i, j] > threshold & !is.na(pmat[i , j]) & pmat[i , j] < 0.05){ 
    Correlations[, ':='(i_n = i, j_n = j, correlation = cormat[i , j], p = pmat[i , j], predictorA =colnames(cormat)[i], 
          predictorB = colnames(cormat)[j]) ] 
} 

Correlations <- data.table(i_n = numeric(), j_n = numeric(), correlation = numeric(), p = numeric(), predictorA = character(), 
          predictorB = character()) 
> class(Correlations) 
[1] "data.table" "data.frame" 
> glimpse(Correlations) 
Observations: 0 
Variables: 6 
$ i   <dbl> 
$ j   <dbl> 
$ correlation <dbl> 
$ p   <dbl> 
$ predictorA <chr> 
$ predictorB <chr> 

は、結果的に、私はcormat行列とPMATマトリックスをループするコードを作曲:

だから私は、関心の値を格納するためにdata.tableを作成しましたエラーメッセージは表示されませんが、何もしません。

> dim(Correlations) 
[1] 0 6 

実際には、 deはデータテーブルを更新します。期待どおりの相関関係:

> Correlations[, ':='(i_n = 1, j_n = 2, correlation = 1, p = 2, predictorA ="A", 
+      predictorB = "B") ] 
> dim(Correlations) 
[1] 0 6 

次はdplyrを試しました。

for (i in (1 : (ncol(cormat) - 1))){ 
    for(j in ((i+1) : ncol(cormat))){ 
     if (cormat[i, j] > threshold & !is.na(pmat[i , j]) & pmat[i , j] < 0.05){ 
     Correlations <- Correlations %>% mutate(i = i, j = j, correlation = cormat[i , j], p = pmat[i , j], predictorA =colnames(cormat)[i], 
               predictorB = colnames(cormat)[j]) 
     } 
    } 
} 

これは、同様に何もしません:

> dim(Correlations) 
    [1] 0 6 

最後に、私は次のコードを試してみました:

k <- 1 
for (i in (1 : (ncol(cormat) - 1))){ 
    for(j in ((i+1) : ncol(cormat))){ 
     if (cormat[i, j] > threshold & !is.na(pmat[i , j]) & pmat[i , j] < 0.05){ 
     Correlations$i_n[k] <- i 
     Correlations$j_n[k] <- j 
     Correlations$correlation[k] <- cormat[i , j] 
     Correlations$p[k] <- pmat[i , j] 
     Correlations$predictorA[k] <- colnames(cormat)[i] 
     Correlations$predictorB[k] <- colnames(cormat)[j] 

     k <- k + 1 
     } 
    } 

このコードを再びエラーメッセージなしで実行が、再びテーブルの相関を更新しませんでした。

> dim(Correlations) 
    [1] 0 6 

私が間違っていることを理解するのに役立つでしょうか?なぜ私のコードは、ターゲットテーブルの相関関係を更新しないのですか?何が求められているのかを達成するためには、上記のそれぞれのケースでどのように歓迎すべきでしょうか? cormatとPMATの

サンプル:

cormat

      CustSegmentVBM EmploymentPositionTypeID SafeDepositsLockers StandingOrders CompaniesPayrolls CrossSell Avg_Deposits 
CustSegmentVBM     1.0000     -0.094    -0.0260   0.0140   -0.02300 -0.014  -0.022 
EmploymentPositionTypeID  -0.0940     1.000    0.0470   0.0950   0.17000  0.200  0.140 
SafeDepositsLockers    -0.0260     0.047    1.0000   0.0660   0.00710  0.150  0.062 
StandingOrders     0.0140     0.095    0.0660   1.0000   0.02700  0.530  0.075 
CompaniesPayrolls    -0.0230     0.170    0.0071   0.0270   1.00000  0.066  0.024 
CrossSell      -0.0140     0.200    0.1500   0.5300   0.06600  1.000  0.160 
Avg_Deposits     -0.0220     0.140    0.0620   0.0750   0.02400  0.160  1.000 
Avg_Investments     -0.0038     0.012    0.0078   0.0054   -0.00006  0.014  0.015 
eBranchUser      -0.0023     0.003    0.0012   0.0055   -0.00038  0.013  0.020 
RFM Score      0.0790     0.077    0.0680   0.3000   -0.00290  0.700  0.130 
         Avg_Investments eBranchUser RFM Score 
CustSegmentVBM     -0.00380 -0.00230 0.0790 
EmploymentPositionTypeID   0.01200  0.00300 0.0770 
SafeDepositsLockers    0.00780  0.00120 0.0680 
StandingOrders     0.00540  0.00550 0.3000 
CompaniesPayrolls    -0.00006 -0.00038 -0.0029 
CrossSell      0.01400  0.01300 0.7000 
Avg_Deposits      0.01500  0.02000 0.1300 
Avg_Investments     1.00000  0.00120 0.0054 
eBranchUser      0.00120  1.00000 0.0120 
RFM Score      0.00540  0.01200 1.0000 

PMAT

     CustSegmentVBM EmploymentPositionTypeID SafeDepositsLockers StandingOrders CompaniesPayrolls CrossSell Avg_Deposits 
CustSegmentVBM      NA     0.0e+00    0.0e+00  0.0e+00   0.0e+00   0   0 
EmploymentPositionTypeID   0.0000      NA    0.0e+00  0.0e+00   0.0e+00   0   0 
SafeDepositsLockers    0.0000     0.0e+00     NA  0.0e+00   5.6e-07   0   0 
StandingOrders     0.0000     0.0e+00    0.0e+00    NA   0.0e+00   0   0 
CompaniesPayrolls    0.0000     0.0e+00    5.6e-07  0.0e+00    NA   0   0 
CrossSell      0.0000     0.0e+00    0.0e+00  0.0e+00   0.0e+00  NA   0 
Avg_Deposits      0.0000     0.0e+00    0.0e+00  0.0e+00   0.0e+00   0   NA 
Avg_Investments     0.0075     2.2e-16    3.1e-08  1.4e-04   9.7e-01   0   0 
eBranchUser      0.1000     3.5e-02    3.8e-01  9.2e-05   7.9e-01   0   0 
RFM Score      0.0000     0.0e+00    0.0e+00  0.0e+00   3.8e-02   0   0 
         Avg_Investments eBranchUser RFM Score 
CustSegmentVBM     7.5e-03  1.0e-01 0.00000 
EmploymentPositionTypeID   2.2e-16  3.5e-02 0.00000 
SafeDepositsLockers    3.1e-08  3.8e-01 0.00000 
StandingOrders     1.4e-04  9.2e-05 0.00000 
CompaniesPayrolls    9.7e-01  7.9e-01 0.03800 
CrossSell      0.0e+00  0.0e+00 0.00000 
Avg_Deposits      0.0e+00  0.0e+00 0.00000 
Avg_Investments      NA  4.0e-01 0.00014 
eBranchUser      4.0e-01   NA 0.00000 
RFM Score      1.4e-04  0.0e+00  NA 
+0

問題を再現するためのデータはどこですか? 'cormat'と' pmat' – jogo

+0

これは非常に大きな行列です。最初の10個の変数だけを保存したサンプルを投稿しました。ファイルを添付する方法があるかどうかわかりません。 – am7

+0

https://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example – jogo

答えて

0

次のコードは限りdata.tableが懸念しているように動作します

for (i in (1 : (ncol(cormat) - 1))){ 

    for(j in ((i+1) : ncol(cormat))){ 

    if (abs(cormat[i, j]) > threshold & !is.na(pmat[i , j]) & pmat[i , j] < 0.05){ 


     Correlations <- rbind(Correlations, data.table(i_n = i, j_n = j, correlation = cormat[i , j], p = pmat[i , j], predictorA =colnames(cormat)[i], 
          predictorB = colnames(cormat)[j])) 


    } 
} 
関連する問題