Dplyr: применить таблицу функций() к каждому столбцу data.frame

Применить таблицу функций() к каждому столбцу data.frame с использованием dplyr

Я часто применяю табличную функцию для каждого столбца фрейма данных с помощью 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() )

Ответ 1

Вы можете попробовать следующее, которое не полагается на пакет tidyr.

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

Ответ 2

В общем случае вы, вероятно, не захотите запускать 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(), когда вводятся две переменные.

Ответ 3

Использование tidyverse (dplyr и purrr):

library(tidyverse)

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

Ответ 4

Решение от Caner не сработало, но от комментатора akrun (ему идет в заслугу), это решение работало отлично. Кроме того, используя гораздо больший Tibble, чтобы продемонстрировать это. Также я добавил порядок по процентам по убыванию.

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