2017-01-23 6 views
1

Ich schreibe eine Funktion, die einen t-Test auf einem Datenrahmen durchführt und die Daten gemäß den von mir definierten Argumenten untergliedert. Hier ist ein funktionierendes Beispiel der mtcars Daten:Wie man ein Teilmengen-Argument negiert

testfunc <- function(dfrm, varq, factor, gear = FALSE, 
        am = FALSE, carb = FALSE){ 
    # Subset the data according to the arguments: 
    subsetdfrm <- dfrm[which((dfrm[,"gear"] %in% gear) & 
          (dfrm[,"am"] %in% am) & 
          (dfrm[,"carb"] %in% carb)),] 

    # Grab the groups to be compared according to arguments: 
    factorbinary <- get(factor) 

    # The t-test: 
    t <- t.test(dfrm[which(dfrm[factor]==factorbinary[1]), varq], 
       dfrm[which(dfrm[factor]==factorbinary[2]), varq], 
       data = subsetdfrm) 
    print(t) 
} 

Hier wird die Funktion in Aktion, Vergleichen Autos mit 3 Gängen vs Autos mit 4 Gängen, auf automatische Suche (am = 0) Autos mit 2 bis 4 Vergasern:

testfunc(mtcars, "mpg", "gear", gear = c(3,4), am = 0, carb = c(2:4)) 

Beachten Sie, dass ich die Standardwerte der Argumente als "FALSE" definiert. Ich möchte einen Standardwert für diese Argumente finden, der die Untermenge automatisch negiert, was bedeutet, dass alle Werte enthalten sind. Meine beste Lösung war, wenn() Klauseln für jedes der Argumente zu Beginn der Funktion als solche hinzuzufügen:

if(carb == FALSE){gear <- unique(dfrm$gear)} 
if(am == FALSE){am <- unique(dfrm$am)} 
if(carb == FALSE){carb <- unique(dfrm$carb)} 

Das wird schwierig werden, wenn die Anzahl der Parameter erhöht zu verwalten. Gibt es einen Standardwert, für den ich meine Argumente festlegen kann, der die Teilmenge negiert?

Ich stelle mir etwas vor, das dem Gegenteil eines NULL-Objekts entspricht: Ein "Not-NULL" oder ein Platzhalterobjekt, das einfach allem gleicht. Wenn nicht, könnte ich meinen Code ändern, um im Subsetting-Schritt das NULL-Objekt zu verwenden?

Suchvorgänge mit Schlüsselwörtern "alle", "any" und "subset" verweisen normalerweise auf Seiten, die sich auf die Funktionen all() und any() beziehen und haben mich nicht weiter gebracht. Ich würde mich über jede Hilfe freuen, danke.

+1

Wenn Sie einen Vektor von Zeilenindizes haben (wie 'which' zurückkehrt), können Sie sie mit' -' negieren, indem Sie das Komplement auswählen. Siehe https://cran.r-project.org/doc/manuals/R-intro.html – Frank

+1

Oh, ich sehe, du meinst zu * nicht * Teilmenge. Dafür kannst du einfach 'gear = unique (dfrm $ gear)' im 'function (...)' Teil schreiben. Dank der Lazy-Auswertung von R wird dieser Begriff nur ausgewertet, wenn er in der Funktion benötigt wird. – Frank

+0

Welches Modul betrachten wir? Es ist eine sehr lange Seite, vielleicht kann ich ctrl-F ein Schlüsselwort, das mich zu dem Abschnitt führt, auf den du dich beziehst? – naco

Antwort

0

Mit Frank Beitrag in den Kommentaren hier eine Arbeitslösung:

testfunc <- function(dfrm, varq, factor, gear = unique(dfrm$gear), 
        am = unique(dfrm$am), carb = unique(dfrm$carb)){ 
    # Subset the data according to the arguments: 
    subsetdfrm <- dfrm[which((dfrm[,"gear"] %in% gear) & 
          (dfrm[,"am"] %in% am) & 
          (dfrm[,"carb"] %in% carb)),] 

    # Grab the groups to be compared according to arguments: 
    factorbinary <- get(factor) 

    # The t-test: 
    t <- t.test(dfrm[which(dfrm[factor]==factorbinary[1]), varq], 
       dfrm[which(dfrm[factor]==factorbinary[2]), varq], 
       data = subsetdfrm) 
    print(t) 
} 

In meinem ursprünglichen Code, statt dfrm, habe ich eine filepath, die als dfrm von read.csv() importiert werden. Die Funktion scheint kein Problem damit zu haben, dass "dfrm", auf das in den Argumenten Bezug genommen wird, später im Kurs erscheint.