Для полноты картины, вот решение, которое использует удобную функцию data.table
rowid()
.
Важнейший вопрос заключается в том, что изменение формы зависит исключительно от строки положение из value
в каждой (year
, product
) группе.rowid(year, product)
нумерует строки в каждой группе.Таким образом, изменение формы по существу становится однострочным:
library(data.table)
dcast(setDT(df1), year + product ~ rowid(year, product, prefix = "col_"))
year product col_1 col_2 col_3 col_4 col_5
1: 2015 PROD A test1 blue 50 66 66
2: 2018 PROD A test3 red 55 88 90
3: 2018 PROD B test2 yellow 70 88.8 88.8
Обратите внимание, что rowid()
принимает параметр prefix
, чтобы гарантировать, что результирующие имена столбцов синтаксически верны.
Предупреждение: В этом решении предполагается, что year
и product
образуют уникальный ключ для каждой группы.
Данные
Данные считываются как опубликованные ОП без каких-либо изменений данных.Однако для этого требуется несколько строк постобработки:
library(data.table)
df1 <- fread("
2015 PROD A test1
2015 PROD A blue
2015 PROD A 50
2015 PROD A 66
2015 PROD A 66
2018 PROD B test2
2018 PROD B yellow
2018 PROD B 70
2018 PROD B 88.8
2018 PROD B 88.8
2018 PROD A test3
2018 PROD A red
2018 PROD A 55
2018 PROD A 88
2018 PROD A 90",
header = FALSE, col.names = c("year", "product", "value"), drop = 2L)[
, product := paste("PROD", product)][]