1

我正在尝试使用 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,我会执行以下操作:

apply(df, 2, function(x) data.frame(table(x)))

我试过下面的代码不起作用:

df %>% 
  map_df(function(.x) {
    group_by(.x) %>% summarise(n=n()) %>% print()
    })
4

3 回答 3

2

可以使用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
于 2020-10-11T04:09:31.597 回答
1

一个选项lapply

lapply(df, function(x) as.data.frame(table(x)))
于 2020-10-11T21:13:35.607 回答
0

你可以通过tidyverse几种方式做到这一点。

  1. 逐列使用purrr::map
library(dplyr)
purrr::map(names(df), ~df %>% count(.data[[.x]]))
  1. 获取长格式数据,然后计算每列和值
df %>%
  tidyr::pivot_longer(cols = everything()) %>%
  count(name, value)
于 2020-10-11T03:01:40.677 回答