我得到了以下my_data:
geneid chr acc_no start end size strand S1 S2 A1 A2
1 gene_010010 1 AC12345.1 3662 4663 1002 - 328 336 757 874
2 gene_010020 1 AC12345.1 5750 7411 1662 - 480 589 793 765
3 gene_010030 2 AC12345.1 9003 11024 2022 - 653 673 875 920
4 gene_010040 2 AC12345.1 12006 12566 561 - 573 623 483 430
5 gene_010050 3 AC12345.1 15035 17032 1998 - 2256 2333 1866 1944
6 gene_010060 3 AC12345.1 18188 18937 750 - 526 642 650 586
我能够计算给定列的总和,即:
chr.sums <- data.frame(with (my_data, tapply(S1, INDEX=chr, FUN=sum)))
问题是,我想得到chr.sums有四列(S1,S2,A1和A2)和30行对应唯一的chr号。我不想来回切换到Python,但循环遍历列并将输出分配给data.frame中的特定列让我感到困惑。
修改 上面的玩具数据集。
答案 0 :(得分:4)
您可以使用ddply
中的plyr
。这是一些代码:
plyr::ddply(my_data, .(chr), summarize, S1 = sum(S1), S2 = sum(S2),
A1 = sum(A1), A2 = sum(A2))
EDIT。一个更紧凑的解决方案是:
plyr::ddply(my_data, .(chr), colwise(sum, .(S1, S2, A1, A2)))
以下是它的工作原理。首先根据chr
将数据拆分为多个部分。然后,对每个部分总计列S1, S2, A1, A2
。最后,它们被组装回一个数据框架。
如果您遇到split-apply-combine
这类问题,请将plyr
视为解决方案。
答案 1 :(得分:1)
tapply
不会处理多个列,但aggregate
的公式版本将会。
chr.sums <- aggregate(cbind(S1,S2,A1,A2) ~ chr, data = my_data, FUN=sum)))