2016-09-29 102 views
0

我有要由列值中的一個到子集的數據幀,然後我想運行卡方在每個新子集。- [R子集數據幀和運行的功能上的每個子集

我讀到Subsetting a data frame into multiple data frames based on multiple column values這表明我如何子集數據幀的問題。我用的代碼變種建議有:

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

與我的數據的工作,但什麼話,我想知道的是如何重用這些子集這樣:

  • 我怎麼運行的函數在每個新的子集?

我的數據是這樣的:

  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 

所以我想爲劍的一個子集,以及一個用於騎士,我想運行卡方在每個子集。但我不知道該怎麼做。

我試圖做這自己,但沒有成功。我一直在嘗試使用的代碼是關於答案的子集的問題,我連接到上面的變體:

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

然而,這提供了錯誤(list) object cannot be coerced to type 'double'。我有點不知所措,我會很感激任何建議!

+2

使用'lapply' dataframes的名單上。 https://stat.ethz.ch/R-manual/R-devel/library/base/html/lapply.html – Wietze314

+0

我認爲'dplyr'包會有所幫助。如果您製作了一個示例數據集,我會做一個解釋如何的答案。 –

回答

1

使用lapply做一個函數在dataframes列表:

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

感謝您演示如何做到這一點 - 它完美的工作! – Rose