使用 purrr::map 对列进行分组并获取频率
Grouping columns and getting frequency using purrr::map
我正在尝试使用 tidyverse 代码获取多列的交叉表。
示例数据:
df <- data.frame(col1=c("a", "b", "c", "c"), col2=c(NA, "d", "d","e")) %>%
mutate_all(as.character)
df
col1 col2
1 a <NA>
2 b d
3 c d
4 c e
使用应用,我将执行以下操作:
apply(df, 2, function(x) data.frame(table(x)))
我试过下面的代码,但不起作用:
df %>%
map_df(function(.x) {
group_by(.x) %>% summarise(n=n()) %>% print()
})
在 tidyverse
中,您可以通过多种方式完成此操作。
- column-wise 使用
purrr::map
library(dplyr)
purrr::map(names(df), ~df %>% count(.data[[.x]]))
- 获取长格式的数据,然后对每列和值进行统计
df %>%
tidyr::pivot_longer(cols = everything()) %>%
count(name, value)
可以使用 purrr::map
来完成,如下所示:
library(purrr)
map(df, ~as.data.frame(table(.x)))
#> $col1
#> .x Freq
#> 1 a 1
#> 2 b 1
#> 3 c 2
#>
#> $col2
#> .x Freq
#> 1 d 2
#> 2 e 1
选项lapply
lapply(df, function(x) as.data.frame(table(x)))
我正在尝试使用 tidyverse 代码获取多列的交叉表。
示例数据:
df <- data.frame(col1=c("a", "b", "c", "c"), col2=c(NA, "d", "d","e")) %>%
mutate_all(as.character)
df
col1 col2
1 a <NA>
2 b d
3 c d
4 c e
使用应用,我将执行以下操作:
apply(df, 2, function(x) data.frame(table(x)))
我试过下面的代码,但不起作用:
df %>%
map_df(function(.x) {
group_by(.x) %>% summarise(n=n()) %>% print()
})
在 tidyverse
中,您可以通过多种方式完成此操作。
- column-wise 使用
purrr::map
library(dplyr)
purrr::map(names(df), ~df %>% count(.data[[.x]]))
- 获取长格式的数据,然后对每列和值进行统计
df %>%
tidyr::pivot_longer(cols = everything()) %>%
count(name, value)
可以使用 purrr::map
来完成,如下所示:
library(purrr)
map(df, ~as.data.frame(table(.x)))
#> $col1
#> .x Freq
#> 1 a 1
#> 2 b 1
#> 3 c 2
#>
#> $col2
#> .x Freq
#> 1 d 2
#> 2 e 1
选项lapply
lapply(df, function(x) as.data.frame(table(x)))