我曾多次遇到同样的问题,过去曾在 reshape2 中使用过 melt。但这里有一个函数,它需要多行标题以及多列:
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)