我喜欢 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)
我们可以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)
一种选择是使用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。)