提高dplyr汇总的效率

提高dplyr汇总的效率,r,performance,dplyr,R,Performance,Dplyr,我正在尝试从一个大数据集(>60k;NDw)排序并生成一个新表,这里有一个示例 Season ENo HNo Month Day Year Group 638447 2011 A903851 1881023 10 6 2011 Ducks 589219 2010 C409324 3648019 10 8 2010 Ducks 137451 2006 M576033 2506116 10 13 2006 Ducks 88

我正在尝试从一个大数据集(>60k;NDw)排序并生成一个新表,这里有一个示例

       Season     ENo      HNo Month Day Year Group
638447   2011 A903851  1881023    10   6 2011 Ducks
589219   2010 C409324  3648019    10   8 2010 Ducks
137451   2006 M576033  2506116    10  13 2006 Ducks
883040   2013 P886755 43313010    10  17 2013 Ducks
851378   2013 C700399 36413199    11   5 2013 Geese
552791   2010 M902312  2508141    11  16 2010 Ducks
152368   2006 M599973  2496101    10   3 2006 Ducks
395393   2008 C412049  3646096    10  28 2008 Ducks
857709   2013 C671619 36413012     9  15 2013 Ducks
67354    2005 C349762  3643011    10  22 2005 Geese
67126    2005 C427496  3643037    11  25 2005 Geese
62260    2005 C349776  3643023    10   7 2005 Ducks
847364   2013 C570491 36411001    10   5 2013 Ducks
447414   2009 A686943  1808206    11   3 2009 Geese
474743   2009 M813353  2509214    10  24 2009 Ducks
439477   2009 A746048  1639142    10  26 2009 Ducks
781218   2012 P792862  4142177    11  27 2012 Geese
806946   2013 M052893 20712036    11   5 2013 Ducks
174932   2006 C450351  3645098    12   5 2006 Geese
828816   2013 M054683 25012010     9  30 2013 Ducks
我想按季节和HNo分组,得到一些新的变量。其中包括每个季节/HNo所处的组数、每个组的行总数、每个月的组数。结果看起来是这样的,但是在所有的月份里

  Season     HNo groupN total.envelopes ducks geese Octducks
1   2005 1253041      1               2     2     0        2
2   2005 1254026      1               5     5     0        5
3   2005 1254063      2              26    23     3        0
4   2005 1254115      2              14    10     4       10
5   2005 1274023      2              39    28    11       28
我有可以工作的代码,但运行速度很慢,我觉得应该有更好的方法来编写这个代码块。也许我错了,这不是一个大问题,只是想学习如何使我的代码更有效率。下面是我用来获取上述输出的内容

NDw1 = NDw %>%
  group_by(Season,HNo) %>%
  summarise(groupN = n_distinct(Group),
            total.envelopes=n(),
            ducks = length(ENo[Group %in% 'Ducks']),
            geese = length(ENo[Group %in% 'Geese']),
            Octducks = length(ENo[Group=='Ducks' & Month == 10]))

整个代码中有一行表示鸭子和鹅。我尝试使用count而不是length,但它不能像ENo那样使用因子变量。如有任何想法,将不胜感激。感谢您的时间和帮助。

您可以通过设置
ducks=sum(Group='ducks')
geese=sum(Group='geese')
octcducks=sum(Group='ducks'&Month==10)
中的
似乎最好是
按季节、月份、小组分组
如果您每个月都需要。另一个分组是
groupby(seasure,ENo,group)
和than组合结果是的,使用sum比length快得多。我想我先尝试了sum,但没能让它工作,但我确信当时我还有其他错误。谢谢。您的变量“Group”是什么?如果是字符串,这可能会导致性能的巨大滞后。它应该是一个因子(即内存中的整数)。另一个想法是使用多个步骤和
cbind()
组合。看起来您在前两行中做了非常不同的事情
groupN,total.envelopes
vs
ducks,gees,Octducks
。为什么不把台阶分开?