Проблема в том, что map_if
также возвращает неизмененные столбцы.Следовательно, когда OP пытается код (повторяя тот же код, что и в OP, чтобы показать)
map_if(df, is.factor, forcats::fct_count)
#$f1
# A tibble: 2 x 2
# f n
# <fct> <int>
#1 men 3
#2 woman 1
#$f2
# A tibble: 2 x 2
# f n
# <fct> <int>
#1 high 1
#2 low 3
#$n1
#[1] 1 3 3 6 ### it is the same column value unchanged
Здесь мы можем указать .else
и discard
элементы NULL.Таким образом, если мы укажем другие столбцы для возврата NULL
и затем используем discard
NULL
элементов, это будет list
коэффициентов.
library(tidyverse)
map_if(df, is.factor, forcats::fct_count, .else = ~ NULL) %>%
discard(is.null)
#$f1
## A tibble: 2 x 2
# f n
# <fct> <int>
#1 men 3
#2 woman 1
#$f2
# A tibble: 2 x 2
# f n
# <fct> <int>
#1 high 1
#2 low 3
Или другой вариант - summarise_if
и поместите вывод в list
df %>%
summarise_if(is.factor, list(~ list(fct_count(.)))) %>%
unclass
Или другой вариант - gather
в«длинный» формат и затем count
один раз
gather(df, key, val, f1:f2) %>%
dplyr::count(key, val)
Или это можно сделать с помощью lapply
из base R
lapply(df[sapply(df, is.factor)], fct_count)
или с использованием только base R
lapply(df[sapply(df, is.factor)], table)
Или результаты могут быть представлены по-другому
table(names(df)[1:2][col(df[1:2])], unlist(df[1:2]))