Обновление 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] ) )
}
}