[R] lentezza del codice
Ciao a tutti,
ho un problema di lentezza di esecuzione del codice in R.
Ho due matrici:
* la matrice chiamata "dati" con 130 mila riga e due colonne: link.finale e cluster (colonna di tutti zeri)
* la matrice chiamata "prima" con 6488 righe e due colonne: link.finale e cluster (con valori di quest'ultima colonna che vanno da 1 a 5)
La colonna link.finale della matrice prima è stata generata da una unique della colonna link.finale della matrice dati.
Quello che voglio fare è confrontare se il link.finale della matrice dati corrisponde al link.finale della matrice prima. Se si ha questa corrispondenza, vorrei associare alla colonna cluster della matrice dati il valore corrispondente della colonna cluster matrice prima.
Premetto che le due matrici sono ordinate crescentemente per la variabile link.finale.
Ho pensato al seguente codice
Il codice funziona, solo che è lentissimo. In 5 minuti assegna un valore a solo le prime 1000 righe della matrice dati. Dato che la matrice è di 130 mila righe, sembrerebbe che a fare questa semplice operazione ci metta diverse ore...
Conoscete un modo per fare più velocemente questa operazione?
Grazie !
ho un problema di lentezza di esecuzione del codice in R.
Ho due matrici:
* la matrice chiamata "dati" con 130 mila riga e due colonne: link.finale e cluster (colonna di tutti zeri)
* la matrice chiamata "prima" con 6488 righe e due colonne: link.finale e cluster (con valori di quest'ultima colonna che vanno da 1 a 5)
La colonna link.finale della matrice prima è stata generata da una unique della colonna link.finale della matrice dati.
Quello che voglio fare è confrontare se il link.finale della matrice dati corrisponde al link.finale della matrice prima. Se si ha questa corrispondenza, vorrei associare alla colonna cluster della matrice dati il valore corrispondente della colonna cluster matrice prima.
Premetto che le due matrici sono ordinate crescentemente per la variabile link.finale.
Ho pensato al seguente codice
i<-1 j<-1 while(i<=nrow(prima)){ while(prima$link.finale[i]==dati$link.finale[j]){ dati$cluster[j]<-prima$cluster[i] j<-j+1 } i<-i+1 }
Il codice funziona, solo che è lentissimo. In 5 minuti assegna un valore a solo le prime 1000 righe della matrice dati. Dato che la matrice è di 130 mila righe, sembrerebbe che a fare questa semplice operazione ci metta diverse ore...
Conoscete un modo per fare più velocemente questa operazione?
Grazie !

Risposte
Scusami, non si tratta di due matrici ma di due dataframe. La colonna cluster ovviamente è un intero, mentre link.finale è una variabile di tipo carattere.
Cioè se eseguo str(dati) visualizzo
Dunque i link della variabile link.finale (per entrambi i dataframe) sono elencati in ordine alfabetico
Cioè se eseguo str(dati) visualizzo
'data.frame': 6488 obs. of 2 variables: $ link.finale : chr "http://a.com" "http://b.com" ecc... $ cluster : int 1 2 3 3 4 4 4 3 4 4 ...
Dunque i link della variabile link.finale (per entrambi i dataframe) sono elencati in ordine alfabetico
Ci sono suggerimenti?

Il confronto tra stringhe può essere una operazione abbastanza costosa computazionalmente, soprattutto se fatta in un ciclo interno dell'algoritmo e se le stringhe sono molto simili tra di loro come negli URL. Che cosa stai cercando di ottenere esattamente?