【问题标题】:dplyr: apply function table() to each column of a data.framedplyr:将函数 table() 应用于 data.frame 的每一列
【发布时间】:2015-02-23 22:12:26
【问题描述】:

使用 dplyr 将函数 table() 应用于 data.frame 的每一列

我经常使用 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() )

【问题讨论】:

  • 您可以使用 gatherlibrary(tidyr) 将其转换为 long 表单,然后执行 gather(mtcars, Var, Val) %>% group_by(Var) %>% dplyr::mutate(n=n()) %>% group_by(Var,Val) %>% dplyr::mutate(n1=n(), Percent=n1/n)%>% unique()
  • 你能用这种方法发布完整的答案吗

标签: r plyr dplyr


【解决方案1】:

您可以尝试以下不依赖于tidyr 包的方法。

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

【讨论】:

  • 你能详细说明一下答案吗?由于输入 data.frame 更差,我遇到了一些错误,并希望进行故障排除。我可以使用 purrr:map 而不是 Map 错误是 Error in data.frame(..., check.names = FALSE) : arguments imply differing number of rows: 1, 0
【解决方案2】:

使用 tidyverse(dplyr 和 purrr):

library(tidyverse)

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

或者简单地说:

library(tidyverse)

mtcars %>%
    map( table )

【讨论】:

  • 使用 purrr 匿名函数语法,即 mtcars %>% map(~table(.))
【解决方案3】:

一般来说,您可能不想在数据框的每一列上运行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)

当输入两个变量时,您可以使用tidyr 包的spread() 将双向输出转换为用于接收table() 的输出。

【讨论】:

  • mtcars %>% count(cyl)mtcars %>% count(gear, cyl)。我认为问题是如何在一次调用中为每个变量执行此操作。
  • 还不错;但我只是想指出,通常在每一列上运行它会导致非常非常长的输出。至少其中一列可能是唯一的 id 变量。我更新了我的答案以包括使用count,因为它为你做了group_by。谢谢!
【解决方案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()

【讨论】:

    猜你喜欢
    • 2021-06-30
    • 2019-05-09
    • 1970-01-01
    • 2014-03-16
    • 2018-06-06
    • 2018-07-17
    • 2015-01-18
    • 2011-12-28
    相关资源
    最近更新 更多