R преобразование из короткой формы в длинную форму с подсчетами в короткой форме [дубликат]


На этот вопрос уже есть ответ здесь:

У меня есть большая таблица (~100м строк и 28 столбцов) в следующем формате:

ID  A   B   C
1   2   0   1
2   0   1   0
3   0   1   2
4   1   0   0

Столбцы помимо ID (который уникален) дают подсчеты для каждого типа (т. е. A,B,C). Я хотел бы преобразовать это в нижеприведенную длинную форму.

ID  Type
 1   A
 1   A
 1   C
 2   B
 3   B
 3   C
 3   C
 4   A

Я также хотел бы использовать таблицу данных (а не фрейм данных), учитывая размер моего набора данных. Я проверил пакет reshape2 в R относительно преобразования между длинной и короткой формой, однако мне не ясно, если функция melt позволит мне иметь подсчеты в короткой форме, как выше.

Какие-либо предложения о том, как я могу преобразовать это быстро и эффективно в R с помощью reshape2 и/или data.table?

1 2

1 ответ:

Обновление

Вы можете попробовать следующее:

DT[, rep(names(.SD), .SD), by = ID]
#    ID V1
# 1:  1  A
# 2:  1  A
# 3:  1  C
# 4:  2  B
# 5:  3  B
# 6:  3  C
# 7:  3  C
# 8:  4  A

Сохраняет порядок, который вы тоже хотите...


Вы можете попробовать следующее. Я никогда не использовал expandRows на том, что стало бы ~ 300 миллионов строк, но это в основном rep, поэтому он не должен быть медленным.

Это использует melt + expandRows из моего пакета "splitstackshape". Он работает с data.frames или data.table s, поэтому вы можете также использовать data.table для более быстрого плавления....

library(reshape2)
library(splitstackshape)
expandRows(melt(mydf, id.vars = "ID"), "value")
# The following rows have been dropped from the input: 
# 
# 2, 3, 5, 8, 10, 12
# 
#      ID variable
# 1     1        A
# 1.1   1        A
# 4     4        A
# 6     2        B
# 7     3        B
# 9     1        C
# 11    3        C
# 11.1  3        C