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
Wo sind die Daten, um das Problem zu reproduzieren? 'cormat' und' pmat' – jogo
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
https://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example – jogo