Вопрос:

Суммируйте несколько переменных по группам

r

2868 просмотра

2 ответа

11 Репутация автора

У меня есть фрейм данных R, как это с 45389 строк

             gene_id     KOIN1    KOIN2     KOIN3     KOIP1    KOIP2       KOIP3
1 ENSMUSG00000000001 6.0056300 4.677550 6.3490400 9.9992300 9.931780 12.56900000
2 ENSMUSG00000000003 0.0000000 0.000000 0.0000000 0.0000000 0.000000  0.00000000
3 ENSMUSG00000000028 0.9988830 0.407537 1.5629300 0.1845460 1.899790  0.85186600
4 ENSMUSG00000000031 0.0000000 0.818696 0.3708190 0.0419544 0.000000  0.02832700
5 ENSMUSG00000000037 0.0160579 0.172857 0.0988266 0.0000000 1.174690  0.00726742
6 ENSMUSG00000000049 0.3923090 0.000000 0.0000000 0.0000000 0.124112  0.01811530

и так далее...

В столбце gene_id есть несколько дубликатов. Например,

5090  ENSMUSG00000025515 0.00000000 0.00000000 0.1572500 0.000000000 0.000000 0.0000000
5091  ENSMUSG00000025515 0.00000000 0.00000000 0.1572500 0.000000000 0.000000 0.0000000
5095  ENSMUSG00000025515 0.00000000 0.00000000 0.0386388 0.000000000 0.000000 0.0000000
5096  ENSMUSG00000025515 0.00000000 0.00000000 0.0386388 0.000000000 0.000000 0.0000000
5100  ENSMUSG00000025515 0.00000000 0.00000000 0.0000000 0.000000000 0.000000 0.0000000
5101  ENSMUSG00000025515 0.00000000 0.00000000 0.0000000 0.000000000 0.000000 0.0000000
5105  ENSMUSG00000025515 0.33817000 0.06733700 0.4894620 0.000000000 0.000000 0.0000000
5106  ENSMUSG00000025515 0.33817000 0.06733700 0.4894620 0.000000000 0.000000 0.0000000
5110  ENSMUSG00000025515 0.00863568 0.00000000 0.0337577 0.000000000 0.000000 0.0000000
5111  ENSMUSG00000025515 0.00863568 0.00000000 0.0337577 0.000000000 0.000000 0.0000000

Что я в основном хочу сделать, так это свернуть все дубликаты вниз в одну строку, причем значения для каждого столбца являются суммой всех значений.

Я думал, что ddply из пакета plyr будет работать, но он все еще дает мне все дубликаты

newdataframe <- ddply(dataframe,"gene_id",numcolwise(sum))

Это то, что я побежал.

Какие-либо предложения?

Автор: Sang soo Seo Источник Размещён: 16.10.2015 05:33

Ответы (2)


4 плюса

7442 Репутация автора

Обычная старая aggregateсделает:

newdataframe <- aggregate(. ~ gene_id, dataframe, sum)

Формула читает все остальное, агрегированноеgene_id , и sumвычисляет сумму всех значений. Вы также можете использовать, meanнапример.

Если вам просто нужны некоторые другие столбцы, вы можете cbindих:

newdataframe <- aggregate(cbind(col1, col2) ~ gene_id, dataframe, sum)
Автор: Julián Urbano Размещён: 16.10.2015 05:40

7 плюса

17928 Репутация автора

Другой вариант:

library(dplyr)
df %>%
  group_by(gene_id) %>%
  summarise_each(funs(sum))

Который дает:

#Source: local data frame [7 x 7]
#
#             gene_id     KOIN1    KOIN2     KOIN3     KOIP1    KOIP2       KOIP3
#              (fctr)     (dbl)    (dbl)     (dbl)     (dbl)    (dbl)       (dbl)
#1 ENSMUSG00000000001 6.0056300 4.677550 6.3490400 9.9992300 9.931780 12.56900000
#2 ENSMUSG00000000003 0.0000000 0.000000 0.0000000 0.0000000 0.000000  0.00000000
#3 ENSMUSG00000000028 0.9988830 0.407537 1.5629300 0.1845460 1.899790  0.85186600
#4 ENSMUSG00000000031 0.0000000 0.818696 0.3708190 0.0419544 0.000000  0.02832700
#5 ENSMUSG00000000037 0.0160579 0.172857 0.0988266 0.0000000 1.174690  0.00726742
#6 ENSMUSG00000000049 0.3923090 0.000000 0.0000000 0.0000000 0.124112  0.01811530
#7 ENSMUSG00000025515 0.6936114 0.134674 1.4382170 0.0000000 0.000000  0.00000000
Автор: Steven Beaupré Размещён: 16.10.2015 05:50
Вопросы из категории :
32x32