首页 文章

dplyr:将函数table()应用于data.frame的每一列

提问于
浏览
12

使用dplyr将函数table()应用于data.frame的每一列

我经常使用plyr在数据帧的每一列上应用表函数,如下所示:

library(plyr)
ldply( mtcars, function(x) data.frame( table(x), prop.table( table(x) ) )  )

是否可以在dplyr中执行此操作?

我的尝试失败了:

mtcars %>%  do( table %>% data.frame() )
melt( mtcars ) %>%  do( table %>% data.frame() )

3 回答

  • 10

    您可以尝试以下不依赖于 tidyr 包的方法 .

    mtcars %>% 
       lapply(table) %>% 
       lapply(as.data.frame) %>% 
       Map(cbind,var = names(mtcars),.) %>% 
       rbind_all() %>% 
       group_by(var) %>% 
       mutate(pct = Freq / sum(Freq))
    
  • 1

    通常,您可能不希望在数据帧的每一列上运行 table() ,因为至少有一个变量是唯一的( id 字段)并产生非常长的输出 . 但是,您可以使用 group_by()tally() 获取 dplyr 链中的频率表 . 或者你可以使用 count() 为你做 group_by() .

    > mtcars %>% 
        group_by(cyl) %>% 
        tally()
    > # mtcars %>% count(cyl)
    
    Source: local data frame [3 x 2]
    
      cyl  n
    1   4 11
    2   6  7
    3   8 14
    

    如果要执行双向频率表,请按多个变量分组 .

    > mtcars %>% 
        group_by(gear, cyl) %>% 
        tally()
    > # mtcars %>% count(gear, cyl)
    

    您可以使用 tidyr 包的 spread() 将双向输出转换为输出,当输入两个变量时,输出用于接收 table() .

  • 9

    Using tidyverse (dplyr and purrr):

    library(tidyverse)
    
    mtcars %>%
        map( function(x) table(x) )
    

相关问题