使用reshape2使用分隔符重塑数据

时间:2016-02-07 05:19:01

标签: r reshape2

我试图使用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;参数必须是相同的长度

关于如何解决这个问题的任何想法?

1 个答案:

答案 0 :(得分:3)

我们可以使用melt中的data.tablemeasure可以使用多个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