Возможно, вы не получаете plyr или другие функции для изменения формы компонента данных. Как насчет чего-то более прямого и низкого уровня. Если в настоящее время у вас есть только одна строка с A1, A2, A3 ... A10, B1-B10 и т. Д., Затем извлеките этот кусок материала из вашего фрейма данных, я предполагаю столбцы 11-250, а затем просто сделайте это разделите желаемую форму и соедините их вместе.
yDat <- data[, 11:250]
yDF <- lapply( 1:nrow(data), function(i) matrix(yDat[i,], ncol = 24) )
yDF <- do.call(rbind, y) #combine the list of matrices returned above into one
yDF <- data.frame(yDF) #get it back into a data.frame
names(yDF) <- LETTERS[1:24] #might as well name the columns
Это самый быстрый способ получить большую часть ваших данных в нужной форме. Все, что сделала функция lapply
, это добавила атрибуты измерения в каждую строку, чтобы они были в нужной форме, а затем вернула их в виде списка, который был массифицирован с последующими строками. Но теперь он не имеет никакой вашей идентификационной информации из основного data.frame. Вам просто нужно повторить каждую строку первых 10 столбцов 10 раз. Или вы можете использовать вспомогательную функцию merge
, чтобы помочь с этим. Создайте общий столбец, который уже входит в ваши первые 10 строк, в один из столбцов нового data.frame, а затем просто объедините их.
yInfo <- data[, 1:10]
ID <- yInfo$ID
yDF$ID <- rep( yInfo$ID, each = 10 )
newDat <- merge(yInfo, yDF)
И теперь все готово ... в основном, вы можете создать дополнительный столбец с именами новых строк
newDat$condNum <- rep(1:10, nrow(newDat)/10)
Это будет очень быстро работающий код. Ваш data.frame на самом деле не так уж и велик, и большая часть вышеперечисленного будет выполнена через пару секунд.
Вот как вы должны думать о данных в R. Не то, чтобы не было вспомогательных функций для обработки большей части этого, но вы должны делать это, чтобы избежать как можно большего количества циклов. Технически, то, что произошло выше, имело только один цикл, lapply
, использованный прямо в начале. В этом цикле тоже было очень мало (они должны быть компактными, когда вы их используете). Вы пишете в скалярном коде, а в R это очень и очень медленно ... даже если вы при этом не злоупотребляли памятью и не увеличивали объем данных. Кроме того, имейте в виду, что, хотя вы не всегда можете избежать какого-либо цикла, вы почти всегда можете избежать вложенных циклов, что является одной из ваших самых больших проблем.
(прочитайте это , чтобы лучше понять ваши проблемы в этом коде ... вы там сделали большинство больших ошибок)