我经常使用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)
通常,您可能不希望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()两个变量的输出.
| 归档时间: |
|
| 查看次数: |
14018 次 |
| 最近记录: |