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

Ras*_*sen 14 r plyr dplyr

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

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

library(plyr)
ldply( mtcars, function(x) data.frame( table(x), prop.table( table(x) ) )  )
Run Code Online (Sandbox Code Playgroud)

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

我的尝试失败了:

mtcars %>%  do( table %>% data.frame() )
melt( mtcars ) %>%  do( table %>% data.frame() )
Run Code Online (Sandbox Code Playgroud)

Can*_*ner 12

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

mtcars %>% 
   lapply(table) %>% 
   lapply(as.data.frame) %>% 
   Map(cbind,var = names(mtcars),.) %>% 
   rbind_all() %>% 
   group_by(var) %>% 
   mutate(pct = Freq / sum(Freq))
Run Code Online (Sandbox Code Playgroud)


Ras*_*sen 10

使用 tidyverse(dplyr 和 purrr):

library(tidyverse)

mtcars %>%
    map( function(x) table(x) )
Run Code Online (Sandbox Code Playgroud)

或者干脆:

library(tidyverse)

mtcars %>%
    map( table )
Run Code Online (Sandbox Code Playgroud)

  • 使用 purrr 匿名函数语法,即“mtcars %>% map(~table(.))” (3认同)

jos*_*kre 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
Run Code Online (Sandbox Code Playgroud)

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

> mtcars %>% 
    group_by(gear, cyl) %>% 
    tally()
> # mtcars %>% count(gear, cyl)
Run Code Online (Sandbox Code Playgroud)

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

  • `mtcars%>%count(cyl)`或`mtcars%>%count(gear,cyl)`.我认为问题是如何在一次调用中为每个变量执行此操作. (3认同)