ggplot выводит агрегированные суммы, разделенные на столбцы - PullRequest
0 голосов
/ 27 апреля 2018

Я пытаюсь построить комбинированный точечный и линейный график через ggplot.

Я хочу установить для оси X месячные значения и построить агрегированные значения, разделенные на число по оси Y.

Данные испытаний:

minuten <- runif(10)
anzahl <- c("", "", "", "23", "", "3", "", "", "5", "56")
time <- factor(c("Jan", "Jan", "Jan", "Jan", "Feb", "Feb", "Mar", "Mar", "Mar", "Apr"))


df2 <- data.frame(name, anzahl, minuten)

Моя попытка выглядит так:

g = ggplot(data = df2, aes(x=time, y=sum(minuten , na.rm = TRUE)/sum(anzahl))))+
  geom_point(aes(group=time))

g

Я хочу показать minuten / anzahl для каждого месяца. У кого-нибудь есть идеи для ее решения?

С наилучшими пожеланиями

Ответы [ 3 ]

0 голосов
/ 27 апреля 2018

Базовый раствор R

library(ggplot2)
# Sum of minuten and anzahl per month
my_df_agg <- aggregate(minuten + anzahl ~time, my_df, sum) 
# Calculate average
my_df_agg$average <- my_df_agg$minuten/my_df_agg$anzahl
# Plot
ggplot(data = my_df_agg, aes(x=time, y=average))+
  geom_point(aes(group=time))

Раствор с dplyr

library(dplyr)
library(ggplot2)
my_df %>% 
  group_by(time) %>% 
  mutate(average = sum(minuten, na.rm = T)/sum(anzahl, na.rm = T)) %>% 
  ggplot(aes(x=time, y=average))+
  geom_point(aes(group=time))

Выход

enter image description here

Данные

set.seed(1) # for reproducibility
my_df <- data.frame(time = factor(c("Jan", "Jan", "Jan", "Jan", "Feb", "Feb", 
                                    "Mar", "Mar", "Mar", "Apr")), 
                    anzahl = c("", "", "", "23", "", "3", "", "", "5", "56"), 
                    minuten = runif(10))
my_df$anzahl <- as.numeric(my_df$anzahl) # numeric, so we can calculate with it
0 голосов
/ 27 апреля 2018

Вот решение с dplyr.

library(dplyr)
library(ggplot2)
df2 %>%
  group_by(time) %>%
  mutate(anzahl = sum(as.numeric(anzahl), na.rm = TRUE)) %>%
  ungroup() %>%
  group_by(time, anzahl) %>%
  summarise(minuten = mean(minuten)) %>%
  mutate(ratio = minuten / anzahl) %>%
  ungroup() %>%
  mutate(time = factor(time, levels = month.abb[1:4], labels = month.abb[1:4])) %>%
  ggplot(aes(time, ratio)) + geom_point() + ylab("minuten / anzahl")

enter image description here


Данные

df2 <- structure(list(time = structure(c(3L, 3L, 3L, 3L, 2L, 2L, 4L, 
4L, 4L, 1L), .Label = c("Apr", "Feb", "Jan", "Mar"), class = "factor"), 
    anzahl = c("", "", "", "23", "", "3", "", "", "5", "56"), 
    minuten = c(0.051252949051559, 0.749002492986619, 0.0514915327075869, 
    0.20246379589662, 0.16418539150618, 0.785793941700831, 0.841768049867824, 
    0.255166659131646, 0.0798644754104316, 0.00516700255684555
    )), .Names = c("time", "anzahl", "minuten"), row.names = c(NA, 
-10L), class = "data.frame")
0 голосов
/ 27 апреля 2018

В базе R вы можете использовать, например, by.

minuten <- runif(10)
anzahl <- c("", "", "", "23", "", "3", "", "", "5", "56")
time <- factor(c("Jan", "Jan", "Jan", "Jan", "Feb", "Feb", "Mar", "Mar", "Mar", "Apr"))

anzahl <- as.numeric(anzahl)
anzahl[is.na(anzahl)] <- 0

df2 <- data.frame(time, anzahl, minuten)

df3 <- data.frame(value = cbind(unname(by(df2, df2$time, function(x) sum(x$minuten) / sum(x$anzahl)))),
                  time = unique(df2$time))


df3$time <- factor(df3$time, levels = df3$time)

g = ggplot(data = df3, 
           aes(x = time, 
               y = value))+
  geom_point(aes(group=time))

г

enter image description here

...