R语言 创建一个返回多个变量的每个值的计数的表

4nkexdtk  于 2023-04-09  发布在  其他
关注(0)|答案(2)|浏览(136)

这是我的数据框

# Load libraries
library(data.table)
library(expss)
library(sjlabelled) # to call function as_label()

# Create dataframe
a <- data.table("b1" = c(1, 2, 2, 2),  
                "b2" = c(1, 2, 1, 1),
                "b3" = c(1, 1, 1, 1))

# Set value label
val_lab(a) = num_lab("
            1 Yes
            2 No    
")
a = as_label(a)

它看起来像这样:

> a
    b1  b2  b3
1: Yes Yes Yes
2:  No  No Yes
3:  No Yes Yes
4:  No Yes Yes

我想创建一个数据集,返回每个值的总出现次数,它应该如下所示:

Category  b1  b2  b3
1:  Yes     1   3   4
2:  No      3   1   0

这可能与Stata中的tabout命令的工作方式类似。

Category  b1   b2   b3
1:  Yes    25   75   100
2:  No     75   25   0
3:  sum    100  100  100
scyqe7ek

scyqe7ek1#

一种可能性是在使用tidyverse包进行一些转换后使用janitor包:

library(janitor)
library(dplyr)
library(tidyr)

counts <- a %>% 
  pivot_longer(everything(), values_to = "Category") %>% 
  mutate(Category = c("Yes", "No")[Category]) %>% 
  tabyl(Category, name)

输出

Category b1 b2 b3
       No  3  1  0
      Yes  1  3  4

至于百分比,您可以使用janitoradorn函数:

counts %>% 
  adorn_percentages(denominator = "col") %>% 
  adorn_totals("row") %>% 
  adorn_pct_formatting()

注意,请参阅?adorn_pct_formatting以了解其他格式选项。

输出

Category     b1     b2     b3
       No  75.0%  25.0%   0.0%
      Yes  25.0%  75.0% 100.0%
    Total 100.0% 100.0% 100.0%
rqdpfwrv

rqdpfwrv2#

你可以在tidyverse中使用pivots和简单的聚合,尽管我也同意@LMc的观点,janitor是一个很好的表格汇总包。

library(tidyverse)

a |> 
  pivot_longer(everything()) |> 
  group_by(name, value) |> 
  summarise(n = n()) |> 
  mutate(p = n / sum(n)) |> 
  pivot_wider(id_cols = value, names_from = name, values_from = n, values_fill = 0)

# A tibble: 2 × 4
  value    b1    b2    b3
  <chr> <int> <int> <int>
1 No        3     1     0
2 Yes       1     3     4

或者使用values_from = p

# A tibble: 2 × 4
  value    b1    b2    b3
  <chr> <dbl> <dbl> <dbl>
1 No     0.75  0.25     0
2 Yes    0.25  0.75     1

相关问题