dplyr:组中的管道汇总后按

dplyr:组中的管道汇总后按,r,group-by,pipe,dplyr,summary,R,Group By,Pipe,Dplyr,Summary,我有这个data.frame: df_test = structure(list(`MAE %` = c(-0.0647202646339709, -0.126867775585001, -1.81159420289855, -1.03092783505155, -2.0375491194877, -0.160783192796913, -0.585827216261999, -0.052988554472234, -0.703351261894911, -0.902996305924203

我有这个data.frame:

df_test = structure(list(`MAE %` = c(-0.0647202646339709, -0.126867775585001, 
-1.81159420289855, -1.03092783505155, -2.0375491194877, -0.160783192796913, 
-0.585827216261999, -0.052988554472234, -0.703351261894911, -0.902996305924203, 
-0.767676767676768, -0.0101091791346543, -0.0134480903711673, 
-0.229357798165138, -0.176407935028625, -0.627062706270627, -1.75706139769261, 
-1.23024009524439, -0.257391763463569, -0.878347259688137, -0.123613523987705, 
-1.65711947626841, -2.11718534838887, -0.256285931980328, -1.87152777777778, 
-0.0552333609500138, -0.943983402489627, -0.541095890410959, 
-0.118607409474639, -0.840453845076341), Profit = c(7260, 2160, 
-7080, 3600, -8700, 6300, -540, 10680, -1880, -3560, -720, 5400, 
5280, 1800, 11040, -240, -2320, 2520, 10300, -2520, 8400, -9240, 
-5190, 7350, -6790, 3600, -3240, 8640, 7150, -2400)), .Names = c("MAE %", 
"Profit"), row.names = c(NA, 30L), class = "data.frame")
现在我想要一些汇总统计数据,如:

df_test %>% 
    group_by(win.g = Profit > 0) %>%
    summarise(GroupCnt  = n(),
              TopMAE    = filter(`MAE %` > -1) %>% sum(Profit),
              BottomMAE = filter(`MAE %` <= -1) %>% sum(Profit))
但是我的R代码不起作用。我有一个错误:

错误:没有适用于“逻辑”类对象的“筛选器”方法

我已根据错误更改了代码:

df_test %>% 
    group_by(win.g = Profit > 0) %>%
    summarise(UnderStop = n(),
              TopMAE    = filter(., `MAE %` > -1) %>% sum(Profit),
              BottomMAE = filter(., `MAE %` <= -1) %>% sum(Profit))
df_测试%>%
分组依据(win.g=利润>0)%>%
总结(顶部下方=n(),
TopMAE=过滤器(,`MAE%`>-1)%>%总和(利润),
BottomMAE=过滤器(,`MAE%`%总和(利润))
但结果是没有。我又犯了一个错误:

错误:长度(14)不正确,应为16

我试图理解分组行为以及分组后如何在摘要中使用管道,但没有成功。我花了一整天时间在上面


如何获得预期结果表?请在对这些组中的某些函数进行分组和计算时,帮助我理解dplyr逻辑。

这就是您要寻找的吗?(之所以询问,是因为我得到的结果与您的输出不同)

df_测试%>%
分组依据(win.g=利润>0)%>%
总结(CroupCnt=n(),TopMAE=sum(利润[`MAE%`>-1]),

BottomMAE=sum(利润[`MAE%`这就是你想要的吗?(问这个问题是因为我得到的结果与你的产出不同)

df_测试%>%
分组依据(win.g=利润>0)%>%
总结(CroupCnt=n(),TopMAE=sum(利润[`MAE%`>-1]),

BottomMAE=总额(利润)[`MAE%`就我个人而言,我更喜欢解决这样的问题,因为我认识到你在二维上执行分组操作,但你的代码只使用一维。下面是一个在二维上执行相同工作的示例。它比@Sotos提供的代码多一点,但提供的结果与他得到的结果相同

library(dplyr)
library(tidyr)

df_test %>%
  #* Group on two dimensions
  group_by(win.g = Profit > 0,
           top = ifelse(`MAE %` > -1, "TopMAE", "BottomMAE")) %>%
  summarise(GroupCnt = n(),
            SumProfit = sum(Profit)) %>%
  ungroup() %>%

  #* Collapse the GroupCnt
  group_by(win.g) %>%
  mutate(GroupCnt = sum(GroupCnt)) %>%
  ungroup() %>%

  #* From long to wide
  spread(top, SumProfit)

就我个人而言,我更喜欢解决这样一个问题,因为我认识到你在两个维度上执行分组操作,但你的代码只使用一个维度。下面是一个在两个维度上执行相同工作的示例。它比@Sotos提供的代码多一点,但提供了他得到的相同结果

library(dplyr)
library(tidyr)

df_test %>%
  #* Group on two dimensions
  group_by(win.g = Profit > 0,
           top = ifelse(`MAE %` > -1, "TopMAE", "BottomMAE")) %>%
  summarise(GroupCnt = n(),
            SumProfit = sum(Profit)) %>%
  ungroup() %>%

  #* Collapse the GroupCnt
  group_by(win.g) %>%
  mutate(GroupCnt = sum(GroupCnt)) %>%
  ungroup() %>%

  #* From long to wide
  spread(top, SumProfit)

我不确定结果,因为它们与OP的预期结果不同,但如果你得到的是相同的结果,那么我猜这是真的。我也有点担心,直到我看到你的答案。值得一提的是,我发现在这个例子中,你的答案大约是我的两倍。当我将它扩展到1000行时,速度快了四倍。(2对4毫秒)。如果我要使用非常大的数据集,我可能会转换为您的答案。也谢谢!非常好的dplyr样式的示例。您向我展示了dplyr使用的新方法。我想我们可以省略两个ungroup()和一个group_by(),而只需总结一个分组级别:)。代码会少一点,速度也会快一点。但是关于管道内部的汇总和变异等等呢?可能吗?我不确定结果,因为它们与OP的预期结果不同,但如果你得到的是相同的结果,那么我想这是真的。在看到你的答案之前,我也有点担心。值得一提的是,我发现在这个例子中,你的答案大约是我的两倍。当我将它扩展到1000行时,它的速度是我的四倍。(2对4毫秒)。如果我使用的是非常大的数据集,我可能会转换为您的答案。也谢谢!非常好的dplyr样式的示例。您为我展示了dplyr使用的新方法。我想我们可以省略两个ungroup()和一个group_by(),同时总结一个分组级别:)。代码会少一点,速度也会快一点。但是关于内部管道的汇总和变异等等呢?可能吗?谢谢你的解决方案。它确实可读性强,速度快。我现在看到的是我预期的数字是错误的。我在我的帖子中更正了这一点。@Benjamin也给了我们很好的解决方案,并且更具dplyr风格。我投了你的票因为你是第一个。但是关于管道内部的总结和变异等等呢?可能吗?谢谢你的解决方案。它真的可读性强,速度快。我现在看到我预期的数字是错误的。我在我的帖子中纠正了这一点。@Benjamin也给了我们很好的解决方案,而且更多的是dplyr样式。我投了你的票,因为你是f第一个。但是关于管道内部的总结和变异等等呢?可能吗?
library(dplyr)
library(tidyr)

df_test %>%
  #* Group on two dimensions
  group_by(win.g = Profit > 0,
           top = ifelse(`MAE %` > -1, "TopMAE", "BottomMAE")) %>%
  summarise(GroupCnt = n(),
            SumProfit = sum(Profit)) %>%
  ungroup() %>%

  #* Collapse the GroupCnt
  group_by(win.g) %>%
  mutate(GroupCnt = sum(GroupCnt)) %>%
  ungroup() %>%

  #* From long to wide
  spread(top, SumProfit)