Гистограмма пропорции значения в разных столбцах - PullRequest
0 голосов
/ 07 апреля 2020

Новое в R и обнаружение тидиверса:)

У меня есть эти данные:

# A tibble: 169 x 14
   `Nitrous oxide ~ `Fentanyl (choi~ `Ketamine (choi~ `Ketamine (choi~ `Propofol (choi~ `Dexmedetomidin~
   <chr>            <chr>            <chr>            <chr>            <chr>            <chr>           
 1 Unchecked        Unchecked        Checked          Unchecked        Unchecked        Unchecked       
 2 Unchecked        Unchecked        Checked          Unchecked        Unchecked        Unchecked       
 3 Unchecked        Checked          Checked          Checked          Checked          Unchecked       
 4 Checked          Checked          Checked          Checked          Checked          Unchecked       
 5 Checked          Unchecked        Checked          Unchecked        Checked          Unchecked       
 6 Checked          Unchecked        Checked          Unchecked        Checked          Unchecked       
 7 Checked          Checked          Checked          Checked          Checked          Unchecked       
 8 Checked          Checked          Checked          Checked          Checked          Checked         
 9 Checked          Checked          Checked          Checked          Checked          Unchecked       
10 Unchecked        Checked          Checked          Unchecked        Checked          Unchecked 

Это результат опроса, значения "проверены" или "не отмечены" ", строки - один человек, который отвечает, а столбцы - вопросы.

Я хочу сделать гистограмму пропорции" проверено "для каждого вопроса.

Я понимаю, что должен преобразовать свою таблицу, вероятно, для чего-то подобного:

   Name            % of checked
`Nitrous oxide ~   72.35
`Fentanyl (choi~   18.25
`Ketamine (choi~   25.68 
`Ketamine (choi~   26.98 
`Propofol (choi~   15.25 
`Dexmedetomidin~   95.36

Это просто, например, ложные числа. Я не могу сделать это преобразование. После этого мне пришлось использовать ggplot с geom_bar, я думаю.

Не могли бы вы мне помочь? Я пытаюсь считать и суммировать, изменять ... но не работает, и у меня нет решения: /

Ответы [ 3 ]

2 голосов
/ 07 апреля 2020

Вот вариант с использованием Tidyverse, так как это, кажется, ваши предпочтения.

Я сгенерировал несколько тестовых данных, чтобы показать вам принцип, и назвал переменные немного проще, чем ваш сценарий использования:

library(tidyverse)

set.seed(500)
choices <- c("Unchecked", "Checked")
rows <- 20

df <- data.frame(q1 = sample(choices, rows, replace = TRUE),
                 q2 = sample(choices, rows, replace = TRUE),
                 q3 = sample(choices, rows, replace = TRUE),
                 stringsAsFactors = FALSE)

Приведенный ниже код преобразует ваши данные из широкий формат в длинный формат. У меня есть только три примера переменных, поэтому вам нужно настроить r cols = 1:3, чтобы включить все 5 столбцов, которые у вас есть. После этого mutate генерирует логическую переменную на основе ваших данных, затем group_by и суммирует вычисление вопроса, задав c среднее значение ответов. Наконец, очень простая гистограмма ggplot.

df %>% 
  tidyr::pivot_longer(cols = 1:3, 
                      names_to = "question") %>% 
  mutate(result = value == "Checked") %>% 
  group_by(question) %>% 
  summarise(mean = mean(result)) %>% 
  ggplot(aes(x = question,
             y = mean)) +
  geom_col()
1 голос
/ 07 апреля 2020

Лично я бы занялся этим, изменив все значения checked и unchecked на 1 и 0 соответственно. Затем вы можете использовать функцию purrr:map для суммирования и создания процентов по столбцу, а затем передать в виде диаграммы.

dataframe[datframe=="Checked"]==1
dataframe[dataframe=="Unchecked"]==0

dataframe %>%
  mutate_all(as.numeric) %>%
  map_df(~data.frame(Percentage = sum(.x)/length(.x)),
         .id = 'colnames') %>%
ggplot(aes(colnames, Percentage)) +
geom_col()

1 голос
/ 07 апреля 2020

Попробуйте это. Первый. Преобразовать в длинный формат через pivot_longer. Затем выполните вычисления с помощью count, add_count и mutate (вы также можете использовать summarise, но count более кратко). Далее filter для Checked и, наконец, сюжет:

df <- read.table(text = "id   'Nitrous oxide~'  'Fentanyl (choi~ ' 'Ketamine (choi~' 'Ketamine (choi~' 'Propofol (choi~' 'Dexmedetomidin~'
 1 Unchecked        Unchecked        Checked          Unchecked        Unchecked        Unchecked       
 2 Unchecked        Unchecked        Checked          Unchecked        Unchecked        Unchecked       
 3 Unchecked        Checked          Checked          Checked          Checked          Unchecked       
 4 Checked          Checked          Checked          Checked          Checked          Unchecked       
 5 Checked          Unchecked        Checked          Unchecked        Checked          Unchecked       
 6 Checked          Unchecked        Checked          Unchecked        Checked          Unchecked       
 7 Checked          Checked          Checked          Checked          Checked          Unchecked       
 8 Checked          Checked          Checked          Checked          Checked          Checked         
 9 Checked          Checked          Checked          Checked          Checked          Unchecked       
10 Unchecked        Checked          Checked          Unchecked        Checked          Unchecked ", header = TRUE)

df <- select(df, -id)

library(dplyr)
library(tidyr)
library(ggplot2)
library(scales)

df %>%
  pivot_longer(everything(), names_to = "var", values_to = "status") %>% 
  count(var, status) %>% 
  add_count(var, wt = n, name = "total") %>% 
  mutate(pct = n / total) %>% 
  filter(status == "Checked") %>% 
  ggplot(aes(var, pct, fill = var)) +
  geom_col() + 
  guides(fill = FALSE) +
  scale_y_continuous(labels = scales::percent_format())

Создано в 2020-04-07 пакетом представ (v0.3.0)

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