2016-12-01 3 views
0

Ich versuche, über eine Schleife in Anwendung auf eine Matrix zu schreiben. Insbesondere möchte ich den Dataset sortieren und jeden Wert in jeder Variable auf der Grundlage des Medianwerts für diese bestimmte Variable auf Hoch oder Niedrig festlegen. Diese hohen Tiefs würden in die Matrix eingegeben werden.Ich kann nicht schreiben in Matrix von Schleife in R

Mein Code so weit ist:

df ich arbeite mit einem Datensatz mit 36 ​​Zeilen und eine große Anzahl von Spalten, obwohl ich für diesen Fall in einer Auswahl von ihnen nur interessiert.

rows <- 36 
columns <- 100 

output <- matrix(ncol = columns, nrow = rows) 

apply(df[,463:500],2, function(x) 
    for (i in 1:36){ 
    if (x[i] <= median(x)){ 
     output[i,x-462] <- "low" 
    } 
    else 
     output[i,x-462] <- "high" 
    }) 

Zuerst ist, wenn es NAs in meinem Code ich die Störung erhalte: Fehler if (x [i] < = Median (x)) {: fehlende Wert in dem WAHR/FALSCH benötigt

und ich weiß nicht, wie R die NAs ignorieren.

Das zweite Problem ist, dass selbst, wenn ich ohne NAs nur Spalten in df verwende, gibt den Code nur null und die Matrix ist noch leer

Ich weiß einfach, dass zum Beispiel an die Matrix Werke zu schreiben:

> output[1,1] <- "low" 
> output[1,1] 
[1] "low" 

das fühlt sich an wie es sollte wirklich einfach sein, irgendwelche Ideen?

Dank

+0

brauchen wir eine 'dput()' 'von df' –

+0

R ist eine funktionale Programmiersprache, Funktion Nebenwirkungen nicht standardmäßig haben und somit nicht Matrix definiert ändern draußen. Normalerweise können Sie entweder eine for-Schleife verwenden oder wenn Sie 'apply()' verwenden möchten, erstellen Sie eine neue Matrix. – Psidom

Antwort

0

So landete ich bekommen es mit diesem Code zu arbeiten:

rows <- 36 
columns = 50 

output <- matrix(ncol = columns, nrow = rows) 


for (i in 463:482){ 
    for (j in 1:36){ 
     if (is.na(df[j,i]) == FALSE){ 
      if (df[j,i] <= median(df[,i])){ 
      output[j,i-462] <- "low" 
     } 
      else 
      output[j,i-462] <- "high" 
    } 
    } 
} 

ich mit zutraf entfernt. Ich gebe zu, dass ich mit basic looping und fast gar nicht mit apply lapply vertraut bin, also machte das für mich mehr Sinn.

dies nicht gelingt jedoch nach wie vor mit NA zu tun und bekam immer den Fehler

missing value where TRUE/FALSE needed 

Ist es möglich, meinen Code zu modifizieren, für alle NA Einträge zu kompensieren?

+0

Fügen Sie der Median-Funktion das Flag 'na.rm = TRUE' hinzu. Sehen Sie sich auch Sirallens Antwort von oben an, es wird deutlich schneller sein als For-Schleifen. – Dave2e

0

Try this:

sapply(df[,463:500], function(x) ifelse(x <= median(x, na.rm=T),'low','high'))