2017-05-23 5 views
0

Ich habe die Korrelation und p Koeffizienten berechnet und in zwei Matrizen Cormat und Pmat jeweils gespeichert.Aktualisieren einer Datenframe/data.table in R innerhalb einer for-Schleife

Ich habe Code geschrieben, um nach Korrelationen zu suchen, die über einem Schwellenwert liegen, und sie dann in einem Datenframe speichern.

So habe ich eine data.table geschaffen, um die Werte von Interesse zu speichern:

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> 

Folglich bestehen I-Code in einer Schleife durch die CORMAT Matrix und pmat Matrix:

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]) ] 
} 

Dieser Code funktioniert Keine Fehlermeldung, aber nichts:

> dim(Correlations) 
[1] 0 6 

In der Tat, weder die folgenden co de aktualisiert die data.table Korrelationen wie zu erwarten:

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

Als nächstes versuchte ich 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]) 
     } 
    } 
} 

Das tut nichts, auch:

> dim(Correlations) 
    [1] 0 6 

Schließlich habe ich versucht, den folgenden Code:

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 
     } 
    } 

Dieser Code wieder ohne Fehlermeldung ausgeführt, aber wieder nicht die Tabelle Korrelation aktualisiert wurde .

> dim(Correlations) 
    [1] 0 6 

Können Sie mir helfen zu verstehen, was ich falsch mache? Warum aktualisiert mein Code die Korrelation der Zieltabelle nicht? Wie sollte es in jedem der oben genannten Fälle verbessert werden, um das zu erreichen, was verlangt wird?

#

Proben von CORMAT und 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

Wo sind die Daten, um das Problem zu reproduzieren? 'cormat' und' pmat' – jogo

+0

Dies sind sehr große Matrizen. Ich habe eine Probe geschrieben, die nur die ersten 10 Variablen enthält. Ich weiß nicht, ob es eine Möglichkeit gibt, eine Datei anzuhängen. – am7

+0

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

Antwort

0

Der folgende Code bis data.table arbeitet betrifft:

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])) 


    } 
} 
Verwandte Themen