我有一个包含 4 个名义变量的数据框,每个变量有 3 个级别(A、B、C)。我想制作一个高度为 4 宽度为 3 的频率表,其中每一行都包含该变量的水平计数。
df <- data.frame(var1=c('B', 'A', 'C', 'A', 'B', 'B', 'C'),
var2=c('A', 'A', 'A', 'A', 'B', 'B', 'C'),
var3=c('A', 'A', 'A', 'A', 'B', 'B', 'C'),
var4=c('A', 'A', 'A', 'A', 'B', 'B', 'B'))
head(df,10)
var1 var2 var3 var4
1 B A A A
2 A A A A
3 C A A A
4 A A A A
5 B B B B
6 B B B B
7 C C C B
结果应该是这样的:
A B C
var1 2 3 2
var2 4 2 1
var3 4 2 1
var4 4 3 0
有简单的方法吗?
与
stack
:
t(table(stack(df)))
values
ind A B C
var1 2 3 2
var2 4 2 1
var3 4 2 1
var4 4 3 0
在this answer的帮助下,我们可以组合
table
命令的输出,t
ranspose它,并将其作为数据框,row.names
来自df
的列名。
as.data.frame.matrix(t(table(unlist(df), row.names(df)[col(df)])),
row.names = colnames(df))
A B C
var1 2 3 2
var2 4 2 1
var3 4 2 1
var4 4 3 0
使用
tidyverse
包,它非常擅长像这样的数据操作:
library(tidyverse)
df %>%
pivot_longer(cols = starts_with("var"),
names_to = "col",
values_to = "val") %>%
mutate(count = 1) %>%
group_by(col) %>%
summarise(A = sum(count[val == "A"]),
B = sum(count[val == "B"]),
C = sum(count[val == "C"]))
在
tidyr
:
library(tidyr)
df %>%
pivot_longer(everything()) %>%
pivot_wider(names_from = "value", values_from = "value",
values_fn = length, values_fill = 0, names_sort = TRUE)
name A B C
1 var1 2 3 2
2 var2 4 2 1
3 var3 4 2 1
4 var4 4 3 0
使用
tabyl
library(dplyr)
library(janitor)
library(tidyr)
pivot_longer(df, everything()) %>%
tabyl(name, value)
-输出
name A B C
var1 2 3 2
var2 4 2 1
var3 4 2 1
var4 4 3 0