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