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

时间:2014-12-26 17:09:23

标签: r plyr dplyr

使用dplyr

将函数表()应用于data.frame的每一列

我经常使用 plyr 在数据框的每一列上应用table-function,如下所示:

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

4 个答案:

答案 0 :(得分: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 :(得分:9)

通常,您可能不希望在数据帧的每一列上运行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)

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

答案 2 :(得分:0)

使用tidyverse(dplyr和purrr):

library(tidyverse)

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

答案 3 :(得分:0)

Caner的解决方案不起作用,但是来自辅导员akrun(归功于他),该解决方案非常有效。还使用更大的小标题进行演示。我还按降序添加了订单。

library(nycflights13);dim(flights)

tte<-gather(flights, Var, Val) %>% 
group_by(Var) %>% dplyr::mutate(n=n()) %>% 
group_by(Var,Val) %>% dplyr::mutate(n1=n(), Percent=n1/n)%>%
arrange(Var,desc(n1) %>% unique()