Обновление dataframe / data.table в R в цикле for

Я рассчитал коэффициенты корреляции и p и сохранил их в двух матрицах cormat и pmat соответственно.

Я написал код для поиска корреляций, которые превышают пороговое значение, а затем сохранил их в кадре данных.

Итак, я создал data.table для хранения интересующих значений:

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:

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

Этот код не выдает сообщение об ошибке, но ничего не делает:

   > dim(Correlations)
[1] 0 6 

Фактически, ни один из следующих кодов не обновляет корреляции data.table, как ожидалось:

> 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

Не могли бы вы помочь мне понять, что я делаю неправильно? Почему мой код не обновляет целевую таблицу Correlations? Как следует внести поправки в каждом из вышеперечисленных случаев, чтобы выполнить то, что требуется?

#

Образцы 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

1 ответ

Следующий код работает в отношении 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] ) )


  }
}
Другие вопросы по тегам