在dplyr链中使用table()函数

15

有人可以解释一下为什么在dplyr-magrittr管道操作的链条中,table()不起作用吗?这里是一个简单的reprex:

tibble(
  type = c("Fast", "Slow", "Fast", "Fast", "Slow"),
  colour = c("Blue", "Blue", "Red", "Red", "Red")
) %>% table(.$type, .$colour)

Error in sort.list(y) : 'x'必须是原子性的,以便进行'sort.list'操作。您是否对列表调用了'sort'函数?

当然,这样也可以工作:

df <- tibble(
  type = c("Fast", "Slow", "Fast", "Fast", "Slow"),
  colour = c("Blue", "Blue", "Red", "Red", "Red")
) 

table(df$type, df$colour)


       Blue Red
  Fast    1   2
  Slow    1   1

5
你可以使用 df %>% group_by(type, colour) %>% tally()。此代码可对数据框按照 type 和 colour 进行分组,并计算每个组中的行数。 - Sotos
2
你也可以使用 df %>% select(type,colour) %>% table(如果有其他列,可以使用 select). - Lamia
4个回答

21

啊!和我之前使用管道遇到的问题一样,参考(https://dev59.com/t6Hia4cB1Zd3GeqPY8rx)。看来我是个学习慢的人。谢谢! - RobertMyles
我原以为使用 do 也可以解决问题... 我猜是因为 table 的输出不是数据框,所以像 df %>% do(as.data.frame(table(.$type, .$colour))) 这样的代码看起来很糟糕。 - Sotos

15

dplyr 中的 %>% 运算符实际上是从 magrittr 导入的。使用 magrittr,我们还可以使用 %$% 运算符,它会公开前一个表达式中的名称:

library(tidyverse)
library(magrittr)

tibble(
  type = c("Fast", "Slow", "Fast", "Fast", "Slow"),
  colour = c("Blue", "Blue", "Red", "Red", "Red")
) %$% table(type, colour)

输出:

      colour
type   Blue Red
  Fast    1   2
  Slow    1   1

6
我已经开始使用with(table(...)),像这样:
tibble(type = c("Fast", "Slow", "Fast", "Fast", "Slow"),
       colour = c("Blue", "Blue", "Red", "Red", "Red")) %>% 
  with(table(type, colour))

就像我们可能会把%>%读作“然后”,我会把它读作“然后使用这些数据制作这个表格”。


2

Janitor 包中的 tabyl 函数能够很好地与管道一起使用,是原生表格函数的一个很好的替代品。

library(janitor)
#> Warning: package 'janitor' was built under R version 4.1.3
#> 
#> Attaching package: 'janitor'
#> The following objects are masked from 'package:stats':
#> 
#>     chisq.test, fisher.test
mtcars %>%   tabyl(cyl, gear)
#>  cyl  3 4 5
#>    4  1 8 2
#>    6  2 4 1
#>    8 12 0 2

使用 reprex v2.0.2 工具于2023年5月3日创建


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接