【问题标题】:dplyr: filter rows according to aggregated function resultdplyr:根据聚合函数结果过滤行
【发布时间】:2015-07-28 13:45:43
【问题描述】:

我有一个表格列表(金额、年份和月份),我想过滤与完整年份相对应的行。 IE。我想省略我在下面给出的示例数据帧的最后 4 行,即 2015 年,并获得其余 60 行。是否可以使用单个 dplyr 命令来做到这一点?

我试过了:

df %>%
    group_by(year) %>%
    tally() %>%
    filter (n==12) %>%
    ungroup() 

但我猜 ungroup 做了一些与我想要的不同的事情。是否可以使用单个 dplyr 命令来做到这一点?

df <- structure(list(amount = c(16365, 31850, 32230, 34177.75, 27900, 
29650, 28846, 27300, 37115.31, 34130.38, 39676.1, 47244.44, 3500, 
25425.48, 22628.43, 30822.86, 30100, 41567.13, 25400, 23125, 
40073.75, 16505.82, 17770, 38406.03, 1528.25, 23475.77, 29869.69, 
17020, 19270, 13085.47, 10607.48, 7800, 15220, 15260, 17580, 
25094.66, 3908.74, 8150, 25055.89, 19690.65, 12445.4, 10347.39, 
7645.39, 49300, 8690, 13660, 16510, 34457.08, 522.68, 10202, 
18900, 25027.1, 24956.42, 23259, 32743, 37226, 32697, 32258, 
31336.67, 36135.81, 4389.26, 12450, 46220.43, 36770.7), year = c("2010", 
"2010", "2010", "2010", "2010", "2010", "2010", "2010", "2010", 
"2010", "2010", "2010", "2011", "2011", "2011", "2011", "2011", 
"2011", "2011", "2011", "2011", "2011", "2011", "2011", "2012", 
"2012", "2012", "2012", "2012", "2012", "2012", "2012", "2012", 
"2012", "2012", "2012", "2013", "2013", "2013", "2013", "2013", 
"2013", "2013", "2013", "2013", "2013", "2013", "2013", "2014", 
"2014", "2014", "2014", "2014", "2014", "2014", "2014", "2014", 
"2014", "2014", "2014", "2015", "2015", "2015", "2015"), month = c("01", 
"02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12", 
"01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", 
"12", "01", "02", "03", "04", "05", "06", "07", "08", "09", "10", 
"11", "12", "01", "02", "03", "04", "05", "06", "07", "08", "09", 
"10", "11", "12", "01", "02", "03", "04", "05", "06", "07", "08", 
"09", "10", "11", "12", "01", "02", "03", "04")), .Names = c("amount", 
"year", "month"), class = c("tbl_df", "data.frame"), row.names = c(NA, 
-64L))

【问题讨论】:

  • df %>% group_by(year) %>% mutate(nmonths = n()) %>% filter(nmonths == 12)
  • 嗯,所以在这种情况下,我应该使用 mutate 而不是汇总或计数,对吗?您可以将其发布为答案。我会接受的。谢谢。
  • 您也可以不创建这样的“中间”计数列:df %&gt;% group_by(year) %&gt;% filter(n()==12)
  • 我更喜欢@eipi10 的回答

标签: r filter aggregate-functions dplyr


【解决方案1】:

tally() 等同于summarise(n=n())。但是,在这种情况下,您希望保留数据框的原始行,但要进行过滤,以便删除不完整年份的行。 @AndresT 的答案可以正常工作,但您也可以更简洁地做到这一点,而无需创建列来计算每个组的行数的中间步骤:

df %>% group_by(year) %>% filter(n()==12)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-19
    • 2015-10-06
    • 1970-01-01
    • 1970-01-01
    • 2014-11-17
    • 2020-09-05
    • 1970-01-01
    相关资源
    最近更新 更多