2016-06-26 6 views
0

x ist ein Vektor von ganzen Zahlen zwischen 1 und 100 im BereichWie vermeidet man If-Ausdrücke mit Hilfe von Vektorindizes?

I eine Funktion geschaffen, die eine Zahl ist, in der Kategorie bestimmt:

x∈[1,20]: small 
x∈[21,50]: med 
x∈[51, 100]:large 

Hier kann die Funktion:

x <- c(1:99) 

vector.fun<-function(x){ 
    x[x >= 1 & x <=20] <-"small" 
    x[x >= 21 & x <=50] <-"med" 
    x[x >=51 & x <=99] <-"large" 
    return(x) 
} 
vector.fun(89) 

jedoch als Sie können sehen, in der Funktion mein Vektor ist 1:99 anstelle von 1: 100, aus irgendeinem Grund, wenn ich es zu ändern:

x <- c(1:100) 

    vector.fun<-function(x){ 
     x[x >= 1 & x <=20] <-"small" 
     x[x >= 21 & x <=50] <-"med" 
     x[x >=51 & x <=100] <-"large" 
     return(x) 
    } 
    vector.fun(100) 

es erkennt keine Zahl aus der letzten Zeile: x[x >=51 & x <=100] <-"large" und wenn es tut, gibt es "med" statt "groß", wie es sein sollte.

was mache ich falsch? Welche Änderungen sollte ich in meiner Funktion vornehmen, damit 100 im Parameter enthalten ist und "groß" zurückgibt?

+0

'Nötigung 'ist ein wahrscheinlicher Täter – Khashaa

+0

Ihr Funktionsparameter ist der gleiche wie Ihr ursprünglicher Vektor. Der Vektor außerhalb der Funktion wird niemals verwendet. – Psidom

+4

Das erste Mal, wenn Sie Indizes in Ihrem 'x' durch" small "ersetzen, wird' x' zu "character" gezwungen und Sie enden mit Vergleichen wie 'c (" 1 "," 50 "," 60 ")> =" 51 "' und 'c (" 1 "," 50 "," 60 ") <=" 100 "', die sich von ihren "numerischen" Entsprechungen unterscheiden können. Stattdessen, für solche Probleme, verwenden Sie Schnitt (x, c (0, 20, 50, 100), Beschriftungen = c ("klein", "med", "groß") ' –

Antwort

1

Es ist in der Tat ein Zwangsproblem, wie in den obigen Kommentaren erwähnt. Wenn Sie Ihre Funktionsstruktur den Weg halten Sie es erstellt haben, können Sie es wie folgt ändern:

vector.fun<-function(y){ 
    x <- y 
    x[y >= 1 & y <=20] <-"small" 
    x[y >= 21 & y <=50] <-"med" 
    x[y >=51 & y <=100] <-"large" 
    return(x) 
} 

Obwohl die Lösung von @alexis_laz vorgeschlagen ist prägnanter und elegant:

vector.fun<-function(x){ 
    cut(x, c(0,20,50,100), labels = c("small", "med", "large")) 
} 

Halten im Hinblick darauf wird diese zweite Version einen Vektor vom Typ erzeugen, während die erste Version einen Zeichen Typvektor erzeugen wird.

+0

Danke: P macht jetzt Sinn. – AP77

Verwandte Themen