四季花海
为了完整起见,这里是一个使用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_51: 2015 PROD A test1 blue 50 66 662: 2018 PROD A test3 red 55 88 903: 2018 PROD B test2 yellow 70 88.8 88.8请注意,使用rowid()一个prefix参数来确保结果列名称在语法上正确。警告:此解决方案假定了这一点,year并为每个组product形成唯一的密钥。数据数据按OP的原样读取,而无需对数据进行任何修改。但是,这需要几行后处理:library(data.table) df1 <- fread("2015 PROD A test12015 PROD A blue2015 PROD A 502015 PROD A 662015 PROD A 662018 PROD B test22018 PROD B yellow2018 PROD B 702018 PROD B 88.82018 PROD B 88.82018 PROD A test32018 PROD A red2018 PROD A 552018 PROD A 882018 PROD A 90", header = FALSE, col.names = c("year", "product", "value"), drop = 2L)[ , product := paste("PROD", product)][]