R子集化每个子集上的数据帧和运行函数

时间:2016-09-29 09:04:03

标签: r subset

我有一个数据框,我想通过其中一个列值进行子集化,然后我想在每个新子集上运行chi平方。

我阅读了关于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

所以我想要一个Sword的子集,一个Knight的子集,我想在每个子集上运行chi平方。但我不知道该怎么做。

我自己试图这样做,但没有成功。我试图使用的代码是我上面链接的Subsetting问题答案的变体:

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

但是,这会产生错误(list) object cannot be coerced to type 'double'。我有点失落,我很感激任何建议!

1 个答案:

答案 0 :(得分:1)

使用lapply在数据帧列表上执行函数:

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)})