R:循环遍历data.frame列

时间:2011-11-18 13:37:14

标签: r loops dataframe

我得到了以下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中的特定列让我感到困惑。

修改 上面的玩具数据集。

2 个答案:

答案 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)))