一个多变量的大频率表

问题描述 投票:0回答:5

我有一个包含 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 count frequency-analysis
5个回答
7
投票

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

4
投票

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

1
投票

使用

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"]))

0
投票

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

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
© www.soinside.com 2019 - 2024. All rights reserved.