3 回答
TA贡献1811条经验 获得超5个赞
为了完整起见,这里是一个使用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形成唯一的密钥。
数据
数据按OP的原样读取,而无需对数据进行任何修改。但是,这需要几行后处理:
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)][]
- 3 回答
- 0 关注
- 626 浏览
添加回答
举报