Wie kann ich eine verschachtelte Schleife mit lapply in R ersetzen?

Tou Mou

Guten Tag ,

Ich habe diese R-Funktion entwickelt, die Daten in Buckets hasht:

#   The used packages 
    library("pacman")
    pacman::p_load(dplyr, tidyr, devtools, MASS, pracma, mvtnorm, interval, intervals) 
    pacman::p_load(sprof, RDocumentation, helpRFunctions, foreach , philentropy , Rcpp , RcppAlgos) 


  hash<-function(v,p){
  if(dot(v,p)>0) return(1) else (0)   }

  LSH_Band<-function(data,K ){

  # We retrieve numerical columns of data 
  t<-list.df.var.types(data)
  df.r<-as.matrix(data[c(t$numeric,t$Intervals)])
  n=nrow(df.r)

  # we create K*K matrice using normal law
  rn=array(rnorm(K*K,0,1),c(K,K))
  # we create K*K matrice of integers using uniform law , integrs are unique in each column
  rd=unique.array(array(unique(ceiling(runif(K*K,0,ncol(df.r)))),c(K,K)))

  buckets<-array(NA,c(K,n)) 
    for (i in 1:K) {
      for (j in 1:n) {
        buckets[i,j]<-hash(df.r[j,][rd[,i]],rn[,i])
      }
    }   
  return(buckets)   
}
> df.r
  age height salaire.1 salaire.2
1  27    180         0      5000
2  26    178         0      5000
3  30    190      7000     10000
4  31    185      7000     10000
5  31    187      7000     10000
6  38    160     10000     15000
7  39    158     10000     15000
> LSH_Band(df.r, 3 )
     [,1] [,2] [,3] [,4] [,5] [,6] [,7]
[1,]    1    1    1    1    1    1    1
[2,]    1    1    0    0    0    0    0
[3,]    0    0    0    0    0    0    0

Die Punktfunktion ist das Skalarprodukt zweier Vektoren.

  • Meine Lsh-Funktion nimmt eine Zeile meiner Daten und dann einen Teil der erhaltenen Zeile mit df.r[j,][rd[,i]]. df.r[j,]ist j-éme Zeile der Daten.
  • rd[,i] : rd ist eine K * K-Matrix von ganzen Zahlen zwischen 1 und ncol (df.r). Jede Spalte der Matrix enthält nur eindeutige ganze Zahlen.

  • rn[,i] : rn ist eine K * K-Matrix, die Werte des N (0,1) -Gesetzes enthält.

  • In der resultierenden Tabelle werden Beobachtungen in Spalten dargestellt. Ich werde k Zeilen haben. Für die letzte Zeile werde ich das Skalarprodukt zwischen df.r[j,][rd[,K]]und berechnen rn[,K]. Ich werde 1 erhalten, wenn das Skalarprodukt positiv ist. rd[,K]und rn[,K]wird nur für die letzte Zeile in der resultierenden Tabelle und für alle Beobachtungen in dieser Zeile verwendet.

Meine Frage :

Soll die Schleife durch die Variablen i und j durch eine Lapply-Funktion ersetzt werden ?

Meine realen Daten werden groß sein, deshalb stelle ich diese Frage.

Vielen Dank !

Maurits Evers

Das Folgende ist als Kommentar etwas zu lang, daher hier einige Hinweise / Probleme / Bemerkungen:

  1. Zunächst muss ich sagen, dass ich Schwierigkeiten habe zu verstehen, was LHS_Bandtut. Vielleicht würde hier ein Kontext helfen.

  2. Ich verstehe den Zweck bestimmter Funktionen nicht, helpRFunctions::list.df.var.typedie einfach die Spaltennamen von datain a zurückzugeben scheinen list. Beachten Sie auch, dass die t$IntervalsRückgabe NULLauf den von Ihnen angegebenen Beispieldaten basiert. Ich bin mir also nicht sicher, was dort los ist.

  3. Ich sehe den Funktionspunkt auch pracma::dotnicht. Das Punktprodukt zwischen zwei Vektoren kann in Basis R unter Verwendung von berechnet werden %*%. Es ist wirklich kein zusätzliches Paket erforderlich.

  4. Funktion hashkann kompakter geschrieben werden als

    hash <-  function(v, p) +(as.numeric(v %*% p) > 0)
    

    Dies vermeidet die ifBedingung, die langsam ist.


Ungeachtet meines Unverständnisses, was Sie versuchen zu tun, sind hier einige Verbesserungen an Ihrem Code

hash <-  function(v, p) +(as.numeric(v %*% p) > 0)

LSH_Band <- function(data, K, seed = NULL) {

    # We retrieve numerical columns of data
    data <- as.matrix(data[sapply(data, is.numeric)])
    # we create K*K matrice using normal law
    if (!is.null(seed)) set.seed(seed)
    rn <- matrix(rnorm(K * K, 0, 1), nrow = K, ncol = K)
    # we create K*K matrice of integers using uniform law , integrs are unique in each column
    rd <- sapply(seq_len(K), function(col) sample.int(ncol(data), K))
    buckets <- matrix(NA, nrow = K, ncol = nrow(data))
    for (i in 1:K) {
        buckets[i, ] <- apply(data, 1, function(row) hash(row[rd[, i]], rn[, i]))
    }
    buckets
}
  1. Fügen Sie immer eine Option hinzu, um ein Reproduzierbares zu verwenden, seedwenn Sie mit Zufallszahlen arbeiten. Das macht das Debuggen viel einfacher.
  2. Sie können mindestens eine forSchleife durch ersetzen apply(die bei Verwendung MARGIN = 1durch die Zeilen eines matrix(oder array) iteriert ).
  3. Ich habe alle unnötigen Paketabhängigkeiten entfernt und die Funktionalität durch Basis-R-Funktionen ersetzt.

Dieser Artikel stammt aus dem Internet. Bitte geben Sie beim Nachdruck die Quelle an.

Bei Verstößen wenden Sie sich bitte [email protected] Löschen.

bearbeiten am
0

Lass mich ein paar Worte sagen

0Kommentare
LoginNach der Teilnahme an der Überprüfung

Verwandte Artikel

TOP Liste

  1. 1

    So legen Sie mit dem Interface Builder unterschiedliche führende Speicherplätze für unterschiedliche Geräte fest

  2. 2

    Fügen Sie eine weitere Schaltfläche zu gwt Suggest Box hinzu

  3. 3

    Wie konvertiere ich einen Vektor von Bytes (u8) in eine Zeichenfolge?

  4. 4

    Wie kann ich in SCSS mehrere Klassen zu einer einzigen kombinieren?

  5. 5

    Wie konvertiert man einen Datenrahmen im langen Format in eine Liste mit einem geeigneten Format?

  6. 6

    Speichern Sie ein MPAndroidChart-Diagramm in einem Bild, ohne es in einer Aktivität anzuzeigen

  7. 7

    Gruppieren Sie Datenrahmenspalten nach ihrem Datum (die Spaltentitel enthalten) und fassen Sie die Instanzen von Einsen und Nullen in R . zusammen

  8. 8

    Tomcat - Leiten Sie den alten Kontextstamm zum neuen Kontextstamm um

  9. 9

    Eclipse Oxygen - Projekte verschwinden

  10. 10

    Wie wählt man Unterschiede mit drei Tabellen aus?

  11. 11

    Tic Tac Toe-Spiel im React-Reset-Button funktioniert nicht

  12. 12

    So berechnen Sie die Verfügbarkeit von Anwendungen (SLA)

  13. 13

    ElasticSearch BulkShardRequest ist aufgrund von org.elasticsearch.common.util.concurrent.EsThreadPoolExecutor fehlgeschlagen

  14. 14

    Wie kann ich den Kaskadenmodus global einstellen?

  15. 15

    Python: Spalten mit demselben Namen zusammenführen, wobei der Mindestwert beibehalten wird

  16. 16

    So erhalten Sie eine gleichmäßige Höhe für alle Eingabefelder

  17. 17

    Wie erstelle ich einen neuen übergeordneten Knoten außerhalb der .ref (/ path) in der Firebase-Echtzeitdatenbank mithilfe von Cloud-Funktionen (Typescript)?

  18. 18

    Was ist schneller: SUM über NULL oder über 0?

  19. 19

    Wie kann ich eine verschachtelte Schleife mit lapply in R ersetzen?

  20. 20

    Kann ich ein Tkinter-Canvas erstellen, das mehrere Zeilen in einem Text-Widget umfasst?

  21. 21

    Ärgerliches Problem mit yaml, das ich nicht lösen kann

heißlabel

Archiv