Как лучше всего изменить набор данных в 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="_") )

Для любого горячо модератора: да, я знаю, что ответы только на код устарели, но я думаю, что они должны быть приемлемыми для ответов на вопросы, касающиеся кода и данных.

Другие вопросы по тегам