2013-03-08 42 views
3

如果已经回答了此问题,但已答复所有信息,请道歉。我已经能够找到合并数据帧本身或以不同方式合并。我真的很感激任何想法。根据row.names合并数据帧中的行

我有一个非常大,但非常简单的数据框与约。 22500行和48列。我想根据行名称合并数据框中的一些行,并想知道是否有任何方法可以做到这一点。

数据帧的一部分看起来像这样:

      Treatment1 Treatment2 Treatment3 Treatment4 Treatment5 
    Nasvi2EG000001t1   28   43   33   25   64 
    Nasvi2EG000002t2   0   3   0   0   4 
    Nasvi2EG000002t5   0   0   0   0   0 
    Nasvi2EG000002t6   0   0   0   0   0 
    Nasvi2EG000004t1   1   0   0   0   0 
    Nasvi2EG000009t1   0   4   2   0   4 
    Nasvi2EG000013t1   21   8   17   19   7 
    Nasvi2EG000014t1   0   3   0   0   4 
    Nasvi2EG000014t2   0   4   0   0   3 

正如你可以看到行2,3和4是在名称相同,直到“T”后的数字和同具有行8和9我想与名称类似的行合并到一起......

我想直到结束是这样的:

     Treatment1 Treatment2 Treatment3 Treatment4 Treatment5 
    Nasvi2EG000001t1   28   43   33   25   64 
    Nasvi2EG000002   0   3   0   0   4 
    Nasvi2EG000004t1   1   0   0   0   0 
    Nasvi2EG000009t1   0   4   2   0   4 
    Nasvi2EG000013t1   21   8   17   19   7 
    Nasvi2EG000014   0   7   0   0   7 

其中已合并行中的值求和。

非常感谢您的任何想法。

谢谢!

+0

+1因为你的问题很酷。 R很酷! – OneChillDude 2013-03-08 15:29:03

+0

您正在寻找的正确术语是“聚合”,而不是“合并”。 – A5C1D2H2I1M1N2O1R2T1 2013-03-08 15:29:06

回答

4

假设您的data.frame被称为“SODF”,请从row.names创建一个向量,从row.names的末尾去掉“t + some digit”并将其用作聚合变量。

> aggvar <- gsub("(t[0-9]+$)", "", rownames(SODF)) 
> aggregate(. ~ aggvar, SODF, sum) 
      aggvar Treatment1 Treatment2 Treatment3 Treatment4 Treatment5 
1 Nasvi2EG000001   28   43   33   25   64 
2 Nasvi2EG000002   0   3   0   0   4 
3 Nasvi2EG000004   1   0   0   0   0 
4 Nasvi2EG000009   0   4   2   0   4 
5 Nasvi2EG000013   21   8   17   19   7 
6 Nasvi2EG000014   0   7   0   0   7