使用 dplyr 管道语法中的 table() 函数?

Nic*_*ker 7 r dplyr

我喜欢 dplyr 的语法,但我很难以与使用基本 R table() 函数相同的方式轻松获取列联表。table() 没问题,但我不知道如何将它合并到 dplyr 管道语法中。

感谢您的帮助。

这是一些示例数据,其中包含我想要获得的输出。

df <- tibble(id=c(rep("A",100),rep("B",100),rep("C",100)),
               val=c(rnorm(300,mean=500,sd=100))) %>%
  mutate(val_bin=cut(val,breaks=5))

table(df$id,df$val_bin)
Run Code Online (Sandbox Code Playgroud)

输出:

    (210,325] (325,440] (440,554] (554,669] (669,784]
  A         4        22        55        18         1
  B         6        19        46        24         5
  C         3        23        44        22         8
Run Code Online (Sandbox Code Playgroud)

akr*_*run 7

我们可以select选择感兴趣的列并应用table

library(dplyr)
df %>% 
    select(id, val_bin) %>%
    table
Run Code Online (Sandbox Code Playgroud)

或者另一种选择是包裹在{}

df %>%
    {table(.$id, .$val_bin)}
Run Code Online (Sandbox Code Playgroud)

在 中tidyverse,获得所需的输出有点复杂

library(dplyr)
library(tidyr)
df %>%
   count(id, val_bin) %>%
   pivot_wider(names_from = val_bin, values_from = n, values_fill = list(n = 0)) %>%
   column_to_rownames('id')
#   (214,338] (338,461] (461,584] (584,707] (707,831]
#A         5        30        44        20         1
#B         9        30        34        27         0
#C         8        28        43        20         1
Run Code Online (Sandbox Code Playgroud)


r2e*_*ans 6

一种选择是使用with

df %>%
  with(., table(id, val_bin))
#    val_bin
# id  (228,327] (327,426] (426,525] (525,624] (624,723]
#   A         4        19        39        22        16
#   B         5        15        41        32         7
#   C         5        14        44        25        12
Run Code Online (Sandbox Code Playgroud)

从技术上讲,这.不是必需的,

df %>%
  with(table(id, val_bin))
Run Code Online (Sandbox Code Playgroud)

但我发现在很容易混淆数据去向(在with或内table)的情况下,它可能会更清晰一些。(提示:这里它几乎总是第一个函数with。)