R:使用lapply在dplyr :: summarize中进行多级分组

时间:2018-01-18 18:03:04

标签: r dplyr apply lapply

我对R比较陌生,我似乎无法将列表标准应用于data.frame,我正在尝试总结。我一直在阅读一些不同的帖子,但他们似乎只关注一个级别的分组,而不是第二个。

假设我的df看起来像这样(我的实际数据框要大得多。有35种不同的“代码”和大约20种不同的“颜色”)

    [Export ("automaticallyNotifiesObserversForKey:")]
    public static new bool AutomaticallyNotifiesObserversForKey (string key) => false;

    bool _checkValue;

    [Export("CheckValue")]
    public bool CheckValue
    {
        get { return _checkValue; }
        set
        {
            WillChangeValue("CheckValue");
            _checkValue = value;
            DidChangeValue("CheckValue");
        }
    }

    public override void ViewDidLoad ()
    {
        base.ViewDidLoad();

        this.AddObserver("CheckValue", NSKeyValueObservingOptions.New, o =>
        {
            Console.WriteLine($"Observer triggered for {o}");
        });

        CheckValue = false;

理想情况下,我想创建一个汇总表,使我能够按代码对数据进行分组(我已成功使用Group by和Split进行此操作),但我还想创建一个值的总和按标准“颜色”。目前,我只能通过逐个运行标准来实现这一目标。

到目前为止,我已经能够做到这一点:

    Code   Color   Value
[1] A      Red     10
[2] A      Blue    15
[3] A      Red     5
[4] B      Green   20
[5] B      Red     15 
[6] C      Green   10

dfsummary2中的结果是:

#this gives me the total value by each code, like a pivot or a sumif
dfsummary <-df %>% group_by(Code) %>% summarise (total = sum(Value))

#then I was able to come up with this to give me, by Code, value by Color.
dfsummary2 <- df %>% filter(Color == "Red") %>% group_by(Code) 
%>% summarise(sumRed = sum(Value))

我想要完成的是为所有“颜色”创建一个数据框,而不必单独指定每个颜色。

我想要的输出,我们称之为dfsummaryall,看起来像:

   Code   sumRed   
[1] A      15     
[2] B      15    
[3] C      0

这是我难倒的地方。我可以单独运行每一个,然后将它们合并到一个表中,但是我想找到一种在apply函数中工作的方法(lapply,我会想)。这是我绝对是新手的地方。

到目前为止我的尝试,这是我确定我非常错误的地方,就像这样:

    Code   sumRed   sumBlue  sumGreen
[1] A      15       15       0
[2] B      15       0        20
[3] C      0        0        10

我知道在“总结(x == sum(MktValue)”部分中确实存在一个问题,但我真的很难过如何解决这个问题。

真正感谢任何帮助!

1 个答案:

答案 0 :(得分:0)

评论中的用户 duckmayr

df %>% group_by(Code, Color) %>% summarise(Sum = sum(Value)) %>% tidyr::spread(Color, Sum, fill = 0)

这完全符合我的目的。