按组

时间:2015-10-16 17:33:53

标签: r

我有一个像这样的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

我基本上想要做的是将所有重复项折叠成一行,每列的值是所有值的总和。

我认为来自plyr包的ddply会起作用,但它仍然会给我所有的重复

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

这就是我跑的。

有什么建议吗?

2 个答案:

答案 0 :(得分:6)

另一种选择:

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

答案 1 :(得分:3)

简单的旧aggregate可以:

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

该公式读取gene_id sum汇总的所有其他内容,以计算所有值的总和。例如,您也可以使用mean

如果您只想要其他一些列,可以cbind

newdataframe <- aggregate(cbind(col1, col2) ~ gene_id, dataframe, sum)
相关问题