Длинная форма с использованием имен - PullRequest
0 голосов
/ 17 мая 2018

Предположим, у меня есть следующие данные

 A <- c(4,4,4,4,4)
 B <- c(1,2,3,4,4)
 C <- c(1,2,4,4,4)
 D <- c(3,2,4,1,4)
 E <- c(4,4,4,4,5)

data <- data.frame(A,B,C,D,E)
data<- t(data)
colnames(data) = c("num1","freq1","freq2","freq3","totfreq")

> data
  num1 freq1 freq2 freq3 totfreq
A    4     4     4     4       4
B    1     2     3     4       4
C    1     2     4     4       4
D    3     2     4     1       4
E    4     4     4     4       5

Я пытаюсь построить сгруппированную гистограмму. Ось x на обеих сторонах должна быть моей переменной A:E, а y - это значения для freq1, freq2, freq3 для каждой буквы. Мне также нужно сохранить возможность отображения переменных A:E по значениям в totfreq.

Я знаю, что мне нужно преобразовать в длинную форму, но у меня проблемы с настройкой моих данных. Каким-то образом мне нужно A, B, C, D, E, нужно сложить в столбец, другой столбец, который складывает freq1, freq2, freq3, totfreq, и затем последний столбец со значениями. Любой совет, как это сделать?

Я предпочитаю строить графики предпочтительно, но ggplot тоже будет работать

Ответы [ 2 ]

0 голосов
/ 17 мая 2018

Сначала вам нужно отформатировать данные, чтобы их можно было обработать, а затем позвольте ggplot2 творить чудеса.

Найдите код и выходные данные График ниже:

library(dplyr)         #To use mutate
library(ggplot2)
library(reshape2)      #To use melt
library(plotly)
A <- c(4,4,4,4,4)
B <- c(1,2,3,4,4)
C <- c(1,2,4,4,4)
D <- c(3,2,4,1,4)
E <- c(4,4,4,4,5)

data <- data.frame(A,B,C,D,E)
data2=names(data)
data<- t(data)
colnames(data) = c("num1","freq1","freq2","freq3","totfreq")

data=data.frame(data)                      
#Because mutate only works for data.frame not matrix

data=mutate(data,names=data2)%>%select("freq1","freq2","freq3","freq3","totfreq","names")  
# Adding names and removing num1

meltdata=melt(data,id.vars="names")        
#Because we need melted data to perform 

#Graph 1 (colourless and boring)
Graph1=ggplot(meltdata,aes(x=names,y=value))+geom_col()+facet_wrap(~variable)
#Graph 2 (Cool one)
Graph2=ggplot(meltdata,aes(x=names,y=value,fill=variable))+geom_col()+geom_text(label=meltdata$value,position="stack")

#Graph 3 is the best I guess
meltdata=mutate(meltdata,xval=1)
Graph3=ggplot(meltdata,aes(x=xval,y=value,fill=variable))+geom_col()+geom_text(label=meltdata$value,position = position_stack(vjust = 0.5))+
  facet_grid(~names)+theme(panel.background = element_blank(),axis.text.x = element_blank(),
                           axis.ticks.x = element_blank())
Graph3
#If you like plotly so much then just use it by passing ggplot variable, But ggplot is better if you ask me
ggplotly(Graph1)
ggplotly(Graph2)
ggplotly(Graph3)

Graph1 Output

Graph2 Output

Graph3 Output

0 голосов
/ 17 мая 2018

Во-первых, у вас есть матрица, но, вероятно, вы хотите фрейм данных.Если вы сделаете тиббл, вы потеряете имена строк, в которых хранятся ваши письма, поэтому

as.data.frame(data) %>% rownames_to_column("id")

даст вам фрейм данных со столбцом id букв.

Выхочу поместить эти данные в длинный формат, собрав все столбцы freq.Затем я добавляю столбец, который дает тип наблюдения;в этом нет необходимости, но поскольку вы говорите, что хотите легко фильтровать один из двух типов - группы freq1 и т. д. или totfreq - это удобная настройка, которую я часто использую.

library(tidyverse)

A <- c(4,4,4,4,4)
B <- c(1,2,3,4,4)
C <- c(1,2,4,4,4)
D <- c(3,2,4,1,4)
E <- c(4,4,4,4,5)

data <- data.frame(A,B,C,D,E)
data<- t(data)
colnames(data) = c("num1","freq1","freq2","freq3","totfreq")

data_long <- as.data.frame(data) %>%
  rownames_to_column("id") %>%
  gather(key = var, value = value, freq1:totfreq) %>%
  mutate(type = ifelse(var == "totfreq", "total", "by_group"))

head(data_long)
#>   id num1   var value     type
#> 1  A    4 freq1     4 by_group
#> 2  B    1 freq1     2 by_group
#> 3  C    1 freq1     2 by_group
#> 4  D    3 freq1     2 by_group
#> 5  E    4 freq1     4 by_group
#> 6  A    4 freq2     4 by_group

С колонкой type действительно легко фильтровать по типу для построения.Это позволит вам либо перенаправить отфильтрованный фрейм данных во что-то вроде ggplot, либо дать вам столбец для использования для фасетирования или отображения на эстетику.

# for grouped bar chart
data_long %>% filter(type == "by_group")
#>    id num1   var value     type
#> 1   A    4 freq1     4 by_group
#> 2   B    1 freq1     2 by_group
#> 3   C    1 freq1     2 by_group
#> 4   D    3 freq1     2 by_group
#> 5   E    4 freq1     4 by_group
#> 6   A    4 freq2     4 by_group
#> 7   B    1 freq2     3 by_group
#> 8   C    1 freq2     4 by_group
#> 9   D    3 freq2     4 by_group
#> 10  E    4 freq2     4 by_group
#> 11  A    4 freq3     4 by_group
#> 12  B    1 freq3     4 by_group
#> 13  C    1 freq3     4 by_group
#> 14  D    3 freq3     1 by_group
#> 15  E    4 freq3     4 by_group

# for total freqs
data_long %>% filter(type == "total")
#>   id num1     var value  type
#> 1  A    4 totfreq     4 total
#> 2  B    1 totfreq     4 total
#> 3  C    1 totfreq     4 total
#> 4  D    3 totfreq     4 total
#> 5  E    4 totfreq     5 total

Создано 2018-05-17 пользователем Представить пакет (v0.2.0).

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