Переформатирование фрейма данных для возможности построения гистограмм с помощью ggplot2 - PullRequest
0 голосов
/ 06 июня 2018

Вопросы относятся к переформатированию фрейма данных (df), чтобы справиться с отображением трех гистограмм на одной диаграмме с помощью ggplo2 ().Спасибо за каждый ответ!

Данные, которые у меня есть в df:

colA,    colB,    colC
label1,  label1,  label2
label3,  label1,  label3
label4,  label4,  label2
label5,  label4,  label5

С этими данными я могу создать гистограммы для каждого столбца с помощью команды ниже, которая представляет количество для каждой меткив данном столбце.

  pl <- ggplot(df,aes(x=colA))
  pl1 <- pl + geom_bar() 
  pl1 <- pl1 + theme(axis.text.x = element_text(angle = 90, hjust = 1))
  pl1 <- pl1 + xlab('Labels')+ ylab('Count')
  pl1 <- pl1 + ggtitle('Some Title') + theme(plot.title = element_text(hjust = 0.5))

  print(pl1)

Однако я хотел бы изобразить счетчики для всех трех столбцов на одной гистограмме, а не на отдельных диаграммах.Я не хочу объединять счетчики для трех столбцов, но изображает столбцы отдельно на одной и той же диаграмме, может быть, в группах для каждой метки , но я не знаю, является ли группирование правильным выбором в этом случае.Формат данных, я думаю, мне нужно создать нужный график:

Labels,  colA, colB, colC
label1,     1,    2,    0,
label2,     0,    0,    2,
label3,     1     0,    1,
label4,     1,    2,    0,
label5,     1,    0,    1,

Вопрос 1: Как я могу переформатировать данные из нынешнего формата в нужный?

Вопрос 2: Как данные могут быть представлены на одной гистограмме с числом?

Ответы [ 2 ]

0 голосов
/ 06 июня 2018

Для желаемого формата вы можете легко сделать комбинацию tidyr::gather и reshape2::dcast.

library(tidyverse)
library(reshape2)
df %>%
  gather(column, label) %>%
  dcast(label ~ column, fun.aggregate = length, value.var = "column")

#    label colA colB colC
# 1 label1    1    2    0
# 2 label2    0    0    2
# 3 label3    1    0    1
# 4 label4    1    2    0
# 5 label5    1    0    1

Это широкий формат, если говорить на R.При использовании ggplot2 гораздо проще использовать формат long.

df %>%
  gather(column, label) %>%
  group_by(column, label) %>%
  count()

#   column label      n
#   <chr>  <chr>  <int>
# 1 colA   label1     1
# 2 colA   label3     1
# 3 colA   label4     1
# 4 colA   label5     1
# 5 colB   label1     2
# 6 colB   label4     2
# 7 colC   label2     2
# 8 colC   label3     1
# 9 colC   label5     1

Вы можете легко передать результат на ggplot2 с помощью

df %>%
  gather(column, label) %>%
  group_by(column, label) %>%
  count() %>%
  ggplot(aes(label, n)) + 
  geom_col() +
  facet_wrap(~column)

enter image description here


Данные

df <- structure(list(colA = c("label1", "label3", "label4", "label5"
), colB = c("label1", "label1", "label4", "label4"), colC = c("label2", 
"label3", "label2", "label5")), class = "data.frame", row.names = c(NA, 
-4L))
0 голосов
/ 06 июня 2018

Одним из подходов может быть преобразование ваших данных в длинный формат с использованием gather, а затем построение графика

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

df %>%
  gather(column_name, column_value) %>%
  group_by(column_value, column_name) %>%
  tally() %>%
  ggplot(aes(x = column_value, y = n, fill = column_name)) +
    geom_bar(stat = "identity") +
    xlab('Labels') + 
    ylab('Count')

, где окончательные данные, которые передаются в ggplot, равны

#  column_value column_name     n
#1 label1       colA            1
#2 label1       colB            2
#3 label2       colC            2
#4 label3       colA            1
#5 label3       colC            1
#6 label4       colA            1
#7 label4       colB            2
#8 label5       colA            1
#9 label5       colC            1

Выходной участок: enter image description here

Пример данных:

df <- structure(list(colA = c("label1", "label3", "label4", "label5"
), colB = c("label1", "label1", "label4", "label4"), colC = c("label2", 
"label3", "label2", "label5")), .Names = c("colA", "colB", "colC"
), class = "data.frame", row.names = c(NA, -4L))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...