2016-09-29 6 views
0

Ich habe ein Datenframe, das ich durch einen der Spaltenwerte unterteilen möchte, und dann möchte ich Chi Quadrat auf jedem der neuen Teilmengen ausführen.R Subsetting Datenframe und laufende Funktion für jede Teilmenge

Ich habe die Frage über Subsetting a data frame into multiple data frames based on multiple column values gelesen, die mir gezeigt hat, wie man einen Datenrahmen untergliedert. Früher habe ich eine Variante auf dem Code dort vorgeschlagen:

split(SpellingVars, with(SpellingVars, interaction(Headword)), drop = TRUE) 

das mit meinen Daten gearbeitet, aber was ich will dann wissen, ist, wie diese Teilmengen wiederzuverwenden so:

  • wie kann ich eine Funktion ausführen über jede neue Teilmenge?

Die Daten Ich habe sieht wie folgt aus:

  SPELLING VARS DATA SET  
    Headword Variant Freq1 Freq2 
    Knight  Kniht  17  22 
    Knight  Knyhht 28  12 
    Knight  Knyt  6  7 
    Sword  Sword  7  8 
    Sword  Swerd  14  44 

Also würde ich für Schwert eine Teilmenge gefallen, und einen für Ritter, und ich möchte chi über jede Teilmenge im Quadrat laufen. Aber ich bin nicht sicher, wie es geht.

Ich habe versucht, dies selbst zu tun, aber mit keinem Erfolg. Der Code, den ich versucht habe zu verwenden, ist eine Variante der Antwort auf die Subsetting Frage, die ich oben verlinkt:

chisq.test(split(SpellingVars, with(SpellingVars, interaction(Headword)), drop = TRUE))

jedoch das gibt den Fehler (list) object cannot be coerced to type 'double'. Ich bin etwas verloren und würde mich über jeden Rat freuen!

+2

Verwendung 'lapply' auf der Liste des Datenrahmen. https://stat.ethz.ch/R-manual/R-devel/library/base/html/lapply.html – Wietze314

+0

Ich denke, das Paket 'dplyr' wird helfen. Wenn Sie einen Beispieldatensatz erstellen, werde ich eine Antwort geben, die zeigt, wie. –

Antwort

1

Verwendung lapply eine Funktion über eine Liste von Datenrahmen zu tun:

SpellingVars <- data.frame(Headword= c('Knight','Knight','Knight','Sword','Sword') 
      ,Variant= c('Kniht', 'Knyhht', 'Knyt', 'Sword', 'Swerd') 
      ,Freq1 = c(17,28,6,7,14) 
      ,Freq2 = c(22,12,7,8,44)) 


sp <- split(SpellingVars, with(SpellingVars, interaction(Headword)), drop = TRUE) 

lapply(sp, function(x){chisq.test(x$Freq1, x$Freq2)}) 
+0

Danke, dass Sie gezeigt haben, wie Sie das machen - es hat perfekt funktioniert! – Rose

Verwandte Themen