提问人:Erjen 提问时间:3/17/2023 最后编辑:benson23Erjen 更新时间:3/18/2023 访问量:117
一个用于多个变量的大型频率表
One large frequency table for multiple variables
问:
我有一个包含 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
有没有简单的方法可以做到这一点?
答:
5赞
benson23
3/17/2023
#1
在这个答案的帮助下,我们可以合并命令的输出,对其进行 ranspose,并将其作为来自 的列名的数据帧。table
t
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
评论
1赞
Erjen
3/17/2023
哇,这奏效了!我自己永远不会想出这个......多谢!
7赞
Maël
3/17/2023
#2
跟: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
1赞
BenL
3/17/2023
#3
使用该包,它非常适合以下数据操作: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"]))
1赞
Maël
3/17/2023
#4
在: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
1赞
akrun
3/18/2023
#5
用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
1赞
TarJae
3/18/2023
#6
我们可以与以下一起使用:xtabs
stack
xtabs(~ind+values, data=stack(df))
values
ind A B C
var1 2 3 2
var2 4 2 1
var3 4 2 1
var4 4 3 0
评论