数据框聚合并保留字符列

时间:2019-08-16 17:53:27

标签: r dataframe aggregate

我有数据框

     ID      type   Count   Out 

     1        A       1      11

     2        A       2      12

     2        B       5      10

     3        B       3      10

     3        B       5       7

     3        C       1       5

预期结果为

    ID   type     Count(sum)    Out (sum)

     1     A        1             11  

     2     AB       7             22 

     3     BBC      9             22

我正在尝试聚合函数,但是没有类型列就可以实现结果表。

我想知道是否有一种方法可以保留预期结果表中显示的字符。

    ID      <- c(1,2,2,3,3,3)
    type    <- c("A","A","B", "B", "B","C")
    Count   <- c( 1,2,5,3,5,1)
    out     <- c(11,12,10,12,7,5)

    x       <- as.data.frame(cbind(ID,Count,out))
    result  <- aggregate(x, list(x$ID), sum_col)

1 个答案:

答案 0 :(得分:0)

您可以在C#中使用Linq来实现您正在描述的操作。我构建了以下Linq查询,以显示此操作。它在第二列中保持顺序,因为内部使用的是就地算法。主要是我使用了GroupBy Linq运算符以及String.JoinSum聚合函数来解决问题。

void Main()
{
    var data = new[] {
        new { Id = 1, Type = "A", Count = 1, Out = 11 },
        new { Id = 2, Type = "A", Count = 2, Out = 12 },
        new { Id = 2, Type = "B", Count = 5, Out = 10 },
        new { Id = 3, Type = "B", Count = 3, Out = 10 },
        new { Id = 3, Type = "B", Count = 5, Out = 7 },
        new { Id = 3, Type = "C", Count = 1, Out = 5 },     
    };

    var result = data
        .GroupBy(d => d.Id)
        .Select(g => new 
        {
            Ids = g.Key, 
            Types = String.Join(String.Empty, g.Select(x => x.Type).ToArray()),
            Counts = g.Sum(d => d.Count),
            Outs = g.Sum(d => d.Out)
        })
        .ToList();

    result.ForEach(r => Console.WriteLine($"{r.Ids} {r.Types} {r.Counts} {r.Outs}"));
}

这将返回以下内容:

  

1 A 1 11

     

2 AB 7 22

     

3 BBC 9 22