如何最好地重塑R中具有两行标题的数据集?

时间:2014-04-23 02:12:16

标签: r melt

我正在使用的数据集在Excel中。它显示了前26周可用产品的单位和收入销售情况。

每行数据代表一个产品。让我们说它们中有50个 第二个标题行基本上可以用rep((" Units"," Revenue")重建,26) 在第一个标题行中的每一个("单位","收入")对之上是一对合并的单元格,它们采用序列"第1周",&# 34;第2周" ...."第26周和第34周。

我基本上想要将数据集从50行转换为50 * 26 = 1300行,包含4列(产品,周,单位,销售)。

我已经看过如何处理两个行标题以及如何使用融合函数重塑数据,但我不确定我是否已经看到任何表明将两者结合起来的最佳实践,特别是在这种情况下,两个标题行都包含重塑数据所需的关键信息。

2 个答案:

答案 0 :(得分:1)

合并的单元格可能会产生什么样的csv文件,但假设使用readLines sep=","在前两行首先需要读取的单元格数是原来的两倍,然后:

gsub( " ", "", paste( rep( row1[row1 > ""], each=2), c("Units","Revenue"), sep="_") )

对于任何炙手可热的主持人:是的,我知道仅限代码的答案已被弃用,但我认为它们应该可以接受回答代码和数据不足的问题。

答案 1 :(得分:1)

我多次遇到同样的问题,过去曾在reshape2中使用过熔化。但是这里有一个函数,它需要多行标题以及多列:

PivReady <- function(data,label_rows,label_columns){
  c<-nrow(data)
  d<-ncol(data)
  pivRdata <- data.frame(matrix(ncol = (label_columns+label_rows+1), nrow = ((c-label_rows)*(d-label_columns))))
    for(i in 1:label_columns){
      pivRdata[,i]<-rep(data[(label_rows+1):c,i],each=(d-label_columns)) 
      }
  trowlabels<-t(data[1:label_rows,(label_columns+1):d])
  pivRdata[,(label_columns+1):(label_columns+label_rows)]<-do.call(rbind, replicate(((c-label_rows)*(d-label_columns))/(d-label_columns), trowlabels, simplify=FALSE))
  datatrans<-t(data[(label_rows+1):c,(label_columns+1):d])
  datatrans<-as.vector(datatrans)
  pivRdata[,(label_columns+label_rows+1)]<-as.data.frame(datatrans)
  names <- data.frame(matrix(ncol = (label_columns+label_rows+1), nrow = 1))
  names[1,1:label_columns]<-as.matrix(data[label_rows,1:label_columns])
  names[1,(label_columns+1):(label_columns+label_rows)]<-paste("Category",1:label_rows,sep="")
  names[1,(label_columns+label_rows+1)]<-"Value"
  names(pivRdata)<-names
  return(pivRdata)
}

是的,我知道这段代码不是很漂亮,但如果您使用headers = FALSE导入数据,然后在上面的函数中指定数据有例如<2列标签(最左边的列)和3行标题,然后这很好用。

例如

long_data <- PivReady(wide_data,3,2)