Как создать набор данных с помощью prop.table?

#r

#r

Вопрос:

Я хотел бы создать набор данных, состоящий из частот, созданных с помощью prop.table. Как бы я это сделал? набор данных здесь https://gofile.io/d/QuqKh5

 (prop.table(table(sample$day12))*100),
(prop.table(table(sample$day13))*100),
(prop.table(table(sample$day14))*100),
(prop.table(table(sample$day15))*100),
(prop.table(table(sample$day16))*100)
 

Вот пример моих данных:

 structure(list(day12 = c("5 = Very High", "5 = Very High", "5 = Very High", 
"4 = High", "5 = Very High", "5 = Very High", "4 = High", "4 = High", 
"5 = Very High", "4 = High"), day13 = c("5 = Very High", "5 = Very High", 
"5 = Very High", "4 = High", "5 = Very High", "4 = High", "4 = High", 
"4 = High", "5 = Very High", "4 = High"), day14 = c("4 = High", 
"5 = Very High", "5 = Very High", "5 = Very High", NA, "3 = Medium", 
"4 = High", "3 = Medium", "4 = High", "4 = High")), row.names = c(NA, 
-10L), class = c("tbl_df", "tbl", "data.frame"))

 

В конечном итоге мне нужно создать такой график, который показывает процентное соотношение 4 = Высокий и 5 = очень высокий (вместе взятый)введите описание изображения здесь

Комментарии:

1. Вместо того, чтобы просить нас загрузить файл Excel и импортировать его, чтобы помочь вам, пожалуйста, создайте небольшую воспроизводимую выборку данных, которую можно копировать / вставлять, и вставьте ее в свой вопрос. dput() очень полезно для этого. Что-то вроде dput(sample[1:10, c("day12", "day13", "day14")]) или подмножество, подобное этому, чтобы проиллюстрировать проблему.

2. Это то, что вы ищете? структура(список(день12 = c(«5 = Очень высокий», «5 = Очень высокий», «5 = очень высокий», «4 = Высокий», «5 = очень высокий», «5 = Очень высокий», «5 = очень высокий», «4 = высокий», «4 = высокий», «5 = очень высокий», «4 = Высокий»), day13 = c («5 = Очень высокий», «5 = Очень высокий», «5 = Очень высокий», «5 = Очень высокий», «4 = Высокий», «5 = очень высокий», «4 = высокий», «4 = Высокий «, «4 = Высокий», «5 = Очень высокий», «4 = Высокий»), day14 = c («4 = Высокий», «5 = Очень высокий», «5 = Очень высокий», «5 = Очень высокий», NA, «3= Средний», «4 = Высокий», «3 = Средний», «4 = Высокий», «4 = Высокий»)), row.names = c(NA, -10L), class = c («tbl_df», «tbl», «data.frame»))

3. Да, это очень полезно. Я могу скопировать / вставить это в свой сеанс R и получить подмножество ваших данных. Теперь, когда об этом позаботились, какова ваша цель? Фрейм данных с … одной строкой на day и 1 столбцом для каждой категории, с prop.table пропорцией в качестве значения? Или с одной строкой для каждой категории и одним столбцом для каждой day ? Или один столбец для дня, один для категории, один для пропорции? Что-то еще? Было бы здорово, если бы вы могли показать ожидаемый результат для того небольшого образца входных данных, с которым вы поделились dput() .

4. Итак, я обновил свой вопрос, включив изображение моего конечного графика. Мне нужно создать график, который показывает процентное соотношение 4 и 5 (вместе взятых) для каждой переменной. Я вручную вычислял проценты и конечный набор данных, но подумал, есть ли способ автоматизировать это?

5. На вашем графике вам нужен один бар в день?

Ответ №1:

Это должно помочь вам в вашем пути. Сначала мы преобразуем данные в длинный формат, затем суммируем их (я включаю недостающие значения как невысокие оценки — возможно, вы захотите обработать их по-другому) и, наконец, выводим его на график.

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

## with dplyr and tidyr
sample_summarized = sample %>%
  pivot_longer(everything(), names_to = "day", values_to = "rating") %>%
  group_by(day) %>%
  summarize(high_proportion = mean(grepl("High", rating)))

## with base
prop_high = sapply(sample, function(x) mean(grepl("High", x)))
sample_summarized = data.frame(high_proportion = prop_high, day = names(prop_high))

ggplot(sample_summarized)  
  aes(x = high_proportion, y = day)  
  geom_col(fill = "#104E8B")  
  geom_text(
    aes(x = high_proportion / 2, label = scales::percent(high_proportion, accuracy = 1)),
    color = "white"
  )  
  scale_x_continuous(labels = scales::percent_format())  
  theme_minimal()
 

введите описание изображения здесь

Комментарии:

1. Спасибо. Есть ли у меня способ сделать это в базе R? В частности, только та часть, где я получаю данные, готовые для ввода в barplot.

2. Добавлен базовый метод для создания фрейма данных.

Ответ №2:

В базе R вы могли бы сделать :

 barplot(colMeans(sapply(df, grepl, pattern = 'High')) * 100)
 

введите описание изображения здесь