Я собираюсь пропустить ту часть, где вы хотите транспонировать, и сделать вывод, что вашей целью для этого было исключительно помочь с построением графиков.Часть, на которой я сосредотачиваюсь: "показывает месяц-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](https://i.stack.imgur.com/qbr3z.png)
Итог: Я не думаю, что вам нужно беспокоиться о переносе ваших данных : при этом возникает много сложностей, которые могут просто запутать вещи.Изменение формы - это хорошо (на мой взгляд), но с такими данными достаточно быстро, поэтому, если ваши данные хранятся в широком формате, вы можете преобразовать их без особых затруднений.(Если вы думаете о том, чтобы поместить это в базу данных, я настоятельно рекомендую вам переосмыслить «широкий», ваша схема БД будет сложной, если вы ее сохраните.)