2016-05-05 10 views
0

Ich möchte eine Funktion schreiben, die zwei kategoriale Variablen nehmen und Mosaikplot, Zählertabelle, Zeilenprozentsatz erstellen und schließlich einen Chi-Quadrat-Test anzeigen. Angenommen, ich habe Daten über den Familienstand (verheiratet/unverheiratet) und ob sie rauchen (ja/nein) oder nicht. Ich möchte, dass es ein Mosaikdiagramm dieser zwei Variablen erstellt, dann zeige ich die Zählungen/Reihenanteile dieser zwei Variablen und führe schließlich einen Chi-Quadrat-Test durch.Ausführen mehrerer Aufgaben mit einer Funktion in R

Ich habe folgendes versucht:

Fnct <- function(x, y) { 
    # Will create mosaic plot, but the labels show up incorrectly 
    plot <- mosaicplot(~x + y, color=TRUE, main = "Mosaic Plot", xlab = x, ylab = y) 

    #creates a 2by2 table and stores it in my table 
    mytable <- table(x, y) 
    mytable2 <- prop.table(mytable, 1) 

    chi <- chisq.test(mytable) 

    return(c(plot, mytable2, chi)) 
} 

Fnct(Data$Marital, Data$Smoker) 

Wenn ich die Daten auszugeben, es Ausgabe der Mosaikplot tut, aber die Etiketten sind falsch. Sie wiederholen wiederholt die Behandlungsstufen, nicht nur den Spaltennamen. Es gibt auch keine Zählungen oder Chi-Quadrat-Tests richtig aus. Was mache ich falsch?

+2

Wir würden uns freuen, wenn Sie zu helfen, ein hinzufügen [minimal reproduzierbares Beispiel] (http://stackoverflow.com/a/5963610/2437479). – shreyasgm

+0

Dies ist eine unordentliche Funktion. Funktionen sollten wirklich eine Sache zurückgeben, entweder als Nebeneffekt (z. B. Plotten) oder als Objekt. Das Zurückgeben einer Liste von verschiedenen Arten von Objekten wird normalerweise ein Schmerz sein, da du sie auseinander ziehen musst, um irgendetwas Nützliches mit ihnen zu tun. Es ist besser, mehr als eine Funktion zu machen, es sei denn, du machst effektiv eine ganze Klasse. – alistaire

+0

@alistaire Ich stimme dem weitgehend zu, aber ich denke, wenn Sie eine QnD-Exploration in einem Dataset durchführen, kann eine Convenience-Funktion, wie sie das OP zu erstellen versucht, sehr nützliche Ergebnisse liefern. Ich bin mir nicht sicher, was der Zweck des OP ist, aber ich habe fxns wie diese verwendet, wenn ich anfange, meine Hände mit Daten schmutzig zu machen (was ich OPs Anwendungsfall dachte). – bouncyball

Antwort

2

Sie sollten nicht einen Vektor zurückgeben. Stattdessen haben sie nur eine Rückkehr list wie so:

Fnct <- function(x,y) { 

    #just plot it, don't return it 
    mosaicplot(~x + y,color=TRUE,main = "Mosaic Plot", 
    xlab = substitute(x), 
    ylab = substitute(y)) 

    mytable2 <-prop.table(table(x, y), 1) 

    chi <- chisq.test(table(x,y)) 

    #return a named list 
    return(list(
       'Row Percentages' = mytable2, 
       'Chi-squared test' = chi)) 
} 

Und dann werden Sie in der folgenden Art und Weise aufgerufen werden soll für die Etiketten richtig zeigen:

with(mydata, Fnct(x, y)) 

Hier ist, wie wäre es Arbeit:

set.seed(1) 
df <- data.frame(A = sample(c('a','b'), 100, replace = T), 
       B = sample(c('foo','bar','haz'), 100, replace = T)) 
with(df, Fnct(A,B)) 

$`Row Percentages` 
    y 
x   bar  foo  haz 
    a 0.5000000 0.2307692 0.2692308 
    b 0.2916667 0.3541667 0.3541667 

$`Chi-Squared Test` 

    Pearson's Chi-squared test 

data: table(x, y) 
X-squared = 4.5998, df = 2, p-value = 0.1003 

enter image description here

Verwandte Themen