2015-10-16 3 views
1

У меня есть кадр 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)) 

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

Любые предложения?

+0

может быть, вам нужно 'суммировать 'там как-то? Нечисловые значения не будут свернуты ... угадать (не тестировать), 'ddply (dataframe," gene_id ", суммировать, numcolwise (sum))'? –

+0

Или 'library (data.table); setDT (df) [, lapply (.SD, sum), by = gene_id] ' –

ответ

3

Plain старый aggregate бы:

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

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

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

newdataframe <- aggregate(cbind(col1, col2) ~ gene_id, dataframe, sum) 
5

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

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 
Смежные вопросы