Что такое экономичный метод распространения, а затем сбора столбцов? (см. пример)

Я пытаюсь переупорядочить свои данные для последующей обработки. Я нашел способ выполнить то, что хочу, но он интенсивно использует память, и я уверен, что есть более эффективный способ.

Вот пример из данных:

   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

Я уверен, что должен быть более эффективный способ сделать это без создания этой массивной промежуточной таблицы. Есть идеи?

imho это зависит от того, что делать с данными (т.е. ваш алгоритм)

jogo 30.05.2019 21:27

вы уверены, что используете спред правильно?

qwr 30.05.2019 21:28

Что касается того, правильно ли я использую распространение, это зависит от вашего определения «правильно»… Я могу получить желаемый результат. Однако я сомневаюсь, что использую его эффективно.

Tsentralka 30.05.2019 21:43
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
3
329
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вариант с использованием 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")

Вау... Я думаю, стоит делать все правильно. Это идеально и намного быстрее. Спасибо!

Tsentralka 30.05.2019 21:51

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