我经常使用 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() )
答案 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()