Показать как Ns, так и пропорции в двухчастотной таблице частот - PullRequest
2 голосов
/ 07 ноября 2019

Я пытаюсь создать таблицу для публикации, которая не соответствует выводу 'tidy':

dummy <- data.frame(categorical_1 = c("a", "b", "a", "a", "b", "b", "a", "b", "b", "a"),
                    categorical_2 = c(rep("one", 5), rep("two", 5)),
                    numeric = sample(1:10, 10))

dummy %>%
  count(categorical_1, categorical_2) %>%
  group_by(categorical_1) %>%      
  mutate(prop = prop.table(n))

Вывод Tidyverse

  categorical_1 categorical_2     n  prop
  <fct>         <fct>         <int> <dbl>
1 a             one               3   0.6
2 a             two               2   0.4
3 b             one               2   0.4
4 b             two               3   0.6

Желаемый вывод:

Category          One       Two
a                 3 (0.6)     2 (0.4)
b                 2 (0.4)     3 (0.6)

Возможно, есть другие mutate шаги, которые я могу применить, чтобы привести таблицу в соответствие с моим желаемым результатом? Спасибо!

Ответы [ 5 ]

3 голосов
/ 07 ноября 2019
library(janitor)

dummy %>%
  tabyl(categorical_1, categorical_2) %>%
  adorn_percentages("row") %>%
  adorn_ns(position = "front")

#>  categorical_1     one     two
#>              a 3 (0.6) 2 (0.4)
#>              b 2 (0.4) 3 (0.6)
2 голосов
/ 07 ноября 2019

Это не сильно отличается от других ответов. Я хотел уловить несколько вещей, которые могут сводиться к предпочтениям:

  • count отбрасывает группы, тогда как summarise снимает последнюю группу;так как вам нужна первая группа (categorical_1) снова в mutate, вы можете позвонить group_by, затем summarise, а затем рассчитать свои пропорции, чтобы иметь немного больше контроля
  • Я нахожу glueна основе функций, с которыми проще работать для такого рода построения строк, чем вызов paste с различными пунктуацией или другими разделителями
  • В желаемом выводе есть имена столбцов в формате заголовка без чисел, поэтому я удалил их вокончательный rename_all
library(dplyr)
library(tidyr)
library(stringr)

dummy %>%
  group_by(categorical_1, categorical_2) %>%
  summarise(n = n()) %>%
  mutate(prop = n / sum(n),
         display = str_glue("{n} ({prop})")) %>%
  select(-n, -prop) %>%
  pivot_wider(names_from = categorical_2, values_from = display) %>%
  rename_all(~str_remove(., "_\\d+") %>% str_to_title())
#> # A tibble: 2 x 3
#> # Groups:   Categorical [2]
#>   Categorical One     Two    
#>   <fct>       <chr>   <chr>  
#> 1 a           3 (0.6) 2 (0.4)
#> 2 b           2 (0.4) 3 (0.6)
2 голосов
/ 07 ноября 2019

Вы можете использовать pivot_wider после объединения n и prop в один столбец

library(tidyverse)

d2 %>% 
  mutate(v = paste0(n, ' (', prop, ')')) %>% 
  pivot_wider(id_cols = categorical_1, names_from = categorical_2, values_from = v) %>% 
  rename_at(1, ~'Category')

# # A tibble: 2 x 3
# # Groups:   Category [2]
#   Category one     two    
#   <fct>    <chr>   <chr>  
# 1 a        3 (0.6) 2 (0.4)
# 2 b        2 (0.4) 3 (0.6)

Исходные данные из вопроса

d2 <- 
  dummy %>%
    count(categorical_1, categorical_2) %>%
    group_by(categorical_1) %>%      
    mutate(prop = prop.table(n))
0 голосов
/ 07 ноября 2019

A data.table решение:

library(data.table)

dcast(setDT(dummy)[, .(count = .N), 
                     .(categorical_1, categorical_2)], 
      categorical_1~categorical_2)[,
                                   .(categorical_1 = categorical_1,
                                     one=paste0(one, " (", one/sum(one), ")"),
                                     two=paste0(two, " (", one/sum(two), ")"))]

#>    categorical_1     one     two
#> 1:             a 3 (0.6) 2 (0.6)
#> 2:             b 2 (0.4) 3 (0.4)

Данные:

dummy <- data.frame(categorical_1 = c("a", "b", "a", "a", "b", "b", "a", "b", "b", "a"),
                    categorical_2 = c(rep("one", 5), rep("two", 5)),
                    numeric = sample(1:10, 10))
0 голосов
/ 07 ноября 2019

Подняв с твоей трубы там, мы можем unite n и prop и spread, т.е.

dummy %>%
     count(categorical_1, categorical_2) %>%
     group_by(categorical_1) %>%
     mutate(prop = prop.table(n))  %>%
     unite(n_prop, n, prop) %>% 
     spread(categorical_2, n_prop)

, что дает,

# A tibble: 2 x 3
# Groups:   categorical_1 [2]
  categorical_1 one   two  
  <fct>         <chr> <chr>
1 a             3_0.6 2_0.4
2 b             2_0.4 3_0.6

Вы можете поиграться с разделителем unite и изменить его, чтобы вставить закрытые круглые скобки. Если вам это нужно строго так

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...