Построение графика, когда временной ряд находится в строках, а не в столбцах, с использованием R - PullRequest
0 голосов
/ 15 ноября 2018

Excel позволяет вам переключать строки и столбцы в функциональности диаграммы.

Я пытаюсь повторить это в R. Мои данные (показаны) ниже, показывают производство для каждой компании в строках.Я не могу понять, как отобразить месяц-1, месяц-2 и т. Д. По оси абсцисс, а также серии для каждой компании на одном графике.Любая помощь приветствуется.

Данные:

sample table

tibble :: tribble (~ Company.Name, ~ Month-1, ~ Month-2, ~ Month-3, ~ Месяц-4, "Comp-1", 945.5438986, 1081.417009, 976.7388701, 864.309703, "Comp-2", 16448.87, 13913.19, 12005.28, 10605.32, "Comp-3", 346.9689321, 398.2297592, 549.420267, 549.120267, 549.120267, 549.120267, 549.120267, 549.420264, 549.120267Comp-4 ", 748.8806367, 949.463941, 1018.877481, 932.3773791)

1 Ответ

0 голосов
/ 17 ноября 2018

Я собираюсь пропустить ту часть, где вы хотите транспонировать, и сделать вывод, что вашей целью для этого было исключительно помочь с построением графиков.Часть, на которой я сосредотачиваюсь: "показывает месяц-1, месяц-2 и т. Д. По оси X, и серии для каждой компании на одном графике" .

Этовыполнимо в базовой графике, но я настоятельно рекомендую использовать ggplot2 (или plotly или аналогичный), потому что он прост в обращении с размерными графиками, подобными этому.«Графика графики» (которую оба стремятся реализовать) действительно предпочитает, чтобы данные, подобные этой, были в «длинном» формате, поэтому часть того, что я сделаю, - это преобразование в этот формат.

Во-первых, некоторые данные:

set.seed(2)
months <- paste0("Month", 1:30)
companies <- paste0("Comp", 1:5)
m <- matrix(abs(rnorm(length(months)*length(companies), sd=1e3)),
            nrow = length(companies))
d <- cbind.data.frame(
  Company = companies,
  m,
  stringsAsFactors = FALSE
)
colnames(d)[-1] <- months
str(d)
# 'data.frame': 5 obs. of  31 variables:
#  $ Company: chr  "Comp1" "Comp2" "Comp3" "Comp4" ...
#  $ Month1 : num  896.9 184.8 1587.8 1130.4 80.3
#  $ Month2 : num  132 708 240 1984 139
#  $ Month3 : num  418 982 393 1040 1782
#  $ Month4 : num  2311.1 878.6 35.8 1012.8 432.3
# (truncated)

Изменение формы может быть выполнено с несколькими библиотеками, включая базу R, вот два метода:

library(data.table)
d2 <- melt(as.data.table(d), id = 1, variable.name = "Month", value.name = "Cost")
d2[,Month := as.integer(gsub("[^0-9]", "", Month)),]
d2
#      Company Month       Cost
#   1:   Comp1     1  896.91455
#   2:   Comp2     1  184.84918
#   3:   Comp3     1 1587.84533
#   4:   Comp4     1 1130.37567
#   5:   Comp5     1   80.25176
#  ---                         
# 146:   Comp1    30  653.67306
# 147:   Comp2    30  657.10598
# 148:   Comp3    30  549.90924
# 149:   Comp4    30  806.72936
# 150:   Comp5    30  997.37972

library(dplyr)
# library(tidyr)
d2 <- tbl_df(d) %>%
  tidyr::gather(Month, Cost, -Company) %>%
  mutate(Month = as.integer(gsub("[^0-9]", "", Month)))

Я также интегрировал Month, так как это имело смысл спорядковая переменная.Это не является строго необходимым, сюжет будет рассматривать их как дискретные.

Сюжет анти-климатически прост:

library(ggplot2)
ggplot(d2, aes(Month, Cost, group=Company)) +
  geom_line(aes(color = Company))

sample ggplot2 plot

Итог: Я не думаю, что вам нужно беспокоиться о переносе ваших данных : при этом возникает много сложностей, которые могут просто запутать вещи.Изменение формы - это хорошо (на мой взгляд), но с такими данными достаточно быстро, поэтому, если ваши данные хранятся в широком формате, вы можете преобразовать их без особых затруднений.(Если вы думаете о том, чтобы поместить это в базу данных, я настоятельно рекомендую вам переосмыслить «широкий», ваша схема БД будет сложной, если вы ее сохраните.)

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