一个用于多个变量的大型频率表

One large frequency table for multiple variables

提问人:Erjen 提问时间:3/17/2023 最后编辑:benson23Erjen 更新时间:3/18/2023 访问量:117

问:

我有一个包含 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

有没有简单的方法可以做到这一点?

R 计数 频率分析

评论


答:

5赞 benson23 3/17/2023 #1

在这个答案的帮助下,我们可以合并命令的输出,对其进行 ranspose,并将其作为来自 的列名的数据帧。tabletrow.namesdf

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

我们可以与以下一起使用:xtabsstack

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