R преобразование из короткой формы в длинную форму с подсчетами в короткой форме [дубликат]
На этот вопрос уже есть ответ здесь:
- Реплицируйте каждую строку данных.кадр и укажите количество повторов для каждой строки 5 ответов
- изменение формы данных.кадр из широкого в длинный формат 5 ответов
У меня есть большая таблица (~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 ответ:
Обновление
Вы можете попробовать следующее:
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.frame
s или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