Как лучше всего изменить набор данных в R, который имеет заголовок из двух строк?
Набор данных, с которым я работаю, находится в Excel. Он показывает продажи продуктов в единицах и в выручке за первые 26 недель доступности.
Каждая строка данных представляет продукт. Допустим, их 50 человек.
2-ую строку заголовка можно в основном восстановить с помощью rep(("Units","Revenue"),26) Над каждой из этих пар ("Units", "Revenue") в 1-й строке заголовка находится объединенная пара ячеек, принимающая последовательность "неделя 1", "неделя 2"...."неделя 26".
Я в основном хочу преобразовать набор данных из 50 строк в 50*26 = 1300 строк с 4 столбцами (Product, Week, Units, Sales).
Я видел, как обрабатывать два заголовка строки и как преобразовывать данные с помощью функции melt, но я не уверен, что видел что-то, что указывает на лучшую практику их объединения, особенно в случаях, подобных этому, когда обе строки заголовка содержат ключевую информацию, необходимую для изменения данных.
2 ответа
Я много раз сталкивался с одной и той же проблемой и в прошлом использовал melt в 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)
}
Да, я знаю, что этот код не очень красив, но если вы импортируете свои данные с заголовками =FALSE и затем укажите в вышеприведенной функции, что данные имеют, например, 2 столбца меток (самый левый столбец) и 3 строки заголовков, то это работает довольно хорошо.
например.
long_data <- PivReady(wide_data,3,2)
Довольно сомнительно, какой тип CSV-файла может появиться в результате объединения ячеек, но если предположить, что таких ячеек в два раза больше, вам сначала нужно прочитать в первых двух строках readLines
с помощью sep=","
, затем:
gsub( " ", "", paste( rep( row1[row1 > ""], each=2), c("Units","Revenue"), sep="_") )
Для любого горячо модератора: да, я знаю, что ответы только на код устарели, но я думаю, что они должны быть приемлемыми для ответов на вопросы, касающиеся кода и данных.