Я пытаюсь переупорядочить свои данные для последующей обработки. Я нашел способ выполнить то, что хочу, но он интенсивно использует память, и я уверен, что есть более эффективный способ.
Вот пример из данных:
X.1 Label X
81 81 21 367.138
82 82 21 384.295
83 83 21 159.496
84 84 21 269.927
85 85 22 364.118
86 86 22 154.475
87 87 22 265.861
Я хочу изменить порядок данных, чтобы создать таблицу значений X для каждого отдельного объекта, как показано ниже:
1 2 3 4
1 367.138 384.295 159.496 269.927
2 364.118 154.475 265.861 NA
Я могу сделать это просто отлично, используя функции spread
, apply
и ldply
, показанные ниже:
X <- apply(tidyr::spread(X, Label,X), 2, function(x) na.omit(x))
X<-X[-1]
X<-plyr::ldply(X, rbind)
X<-as.data.frame(X[-1])
Вот проблема, функция spread
генерирует следующую таблицу в качестве промежуточного шага:
X.1 1 2
1 81 367.138 NA
2 82 384.295 NA
3 83 159.496 NA
4 84 269.927 NA
5 85 NA 364.118
6 86 NA 154.475
7 87 NA 265.861
Это нормально для небольших наборов данных, но для больших наборов данных сгенерированная таблица огромна, и мне не хватает памяти, что приводит к следующей ошибке:
Error: cannot allocate vector of size 8.4 Gb
Я уверен, что должен быть более эффективный способ сделать это без создания этой массивной промежуточной таблицы. Есть идеи?
вы уверены, что используете спред правильно?
Что касается того, правильно ли я использую распространение, это зависит от вашего определения «правильно»… Я могу получить желаемый результат. Однако я сомневаюсь, что использую его эффективно.
Вариант с использованием data.table
dcast(DT, rleid(Label) ~ rowid(Label), value.var = "X")
# Label 1 2 3 4
#1: 1 367.138 384.295 159.496 269.927
#2: 2 364.118 154.475 265.861 NA
данные
library(data.table)
DT <- fread(text = " X.1 Label X
81 21 367.138
82 21 384.295
83 21 159.496
84 21 269.927
85 22 364.118
86 22 154.475
87 22 265.861")
Вау... Я думаю, стоит делать все правильно. Это идеально и намного быстрее. Спасибо!
imho это зависит от того, что делать с данными (т.е. ваш алгоритм)