我有一个像这样的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))
这就是我跑的。
有什么建议吗?
答案 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)