我试图使用reshape2包来重塑我的数据,但我收到了错误。我的数据如下:
mydata<-read.csv("Data.csv")
head(mydata)
Date A.Price B.Price C.Price A.Rating B.Rating C.Rating
31/01/2012 1.273 3.11 1.215 5 4 3
29/02/2012 1.393 3.19 1.205 10 8 7
30/03/2012 1.367 3.15 1.076 10.5 9.5 7.5
我的目标是将其重塑为此:
Date ID Price Rating
31/01/2012 A 1.273 5
31/01/2012 B 3.11 4
31/01/2012 C 1.215 3
29/02/2012 A 1.393 10
29/02/2012 B 3.19 8
....
到目前为止,我的代码是:
mydata$ID <- sequence(nrow(mydata))
out<-melt(reshape(mydata, direction = "long",
timevar = "Group", varying = names(mydata), sep = "."),
id.vars = c("ID", "Price","Rating"))
但我得到了错误:
reshapeLong出错(data,idvar = idvar,timevar = timevar,varying = 变化,:变化&#39;参数必须是相同的长度
关于如何解决这个问题的任何想法?
答案 0 :(得分:3)
我们可以使用melt
中的data.table
,measure
可以使用多个library(data.table)
dM <- melt(setDT(mydata), measure=patterns('Price', 'Rating'),
variable.name='ID', value.name=c('Price', 'Rating'))
列
sub
默认情况下,&#39;变量&#39;(即&#39; ID&#39;)列输出为数字索引。我们可以使用dM[, ID:= sub('\\..*', '', names(mydata)[-1])[ID]]
dM
# Date ID Price Rating
#1: 31/01/2012 A 1.273 5.0
#2: 29/02/2012 A 1.393 10.0
#3: 30/03/2012 A 1.367 10.5
#4: 31/01/2012 B 3.110 4.0
#5: 29/02/2012 B 3.190 8.0
#6: 30/03/2012 B 3.150 9.5
#7: 31/01/2012 C 1.215 3.0
#8: 29/02/2012 C 1.205 7.0
#9: 30/03/2012 C 1.076 7.5
从列名称中获取前缀并更新“ID&ID”。列。
reshape
或者使用base R
中的varying
并将grep
指定为列索引列表。我们可以使用nm1 <- unique(sub('.*\\.', '', names(mydata)[-1]))
res <- reshape(mydata, direction='long', varying= lapply(nm1,
grep, names(mydata)))
row.names(res) <- NULL
head(res)
# Date time A.Price A.Rating id
#1 31/01/2012 1 1.273 5.0 1
#2 29/02/2012 1 1.393 10.0 2
#3 30/03/2012 1 1.367 10.5 3
#4 31/01/2012 2 3.110 4.0 1
#5 29/02/2012 2 3.190 8.0 2
#6 30/03/2012 2 3.150 9.5 3
merged.stack
或另一个选项是来自library(splitstackshape)
的{{1}}。如果我们需要转换为&#39; long&#39;格式基于列名称中的后缀部分,使用sub
获取列名称的后缀,并使用unique
中的var.stubs
元素并将sep
指定为& #39; {var.stubs {1}} merged.stack`
in