【问题标题】:Arrange grouped local data frame in descending order按降序排列分组的本地数据框
【发布时间】:2015-11-11 01:45:52
【问题描述】:

我有一个本地数据框,我试图按 2 个变量(“yr”和“mo”)进行分组,获取每个组中数据的平均值并对结果进行排序,以便最新数据出现在降序排列的顶部。但是,我不知道如何让“yr”变量按降序排序。 “yr”变量错误地按升序显示。

library(dplyr)
df <- tbl_df(data.frame(yr = c(2009, 2009, 2009, 2010, 2010, 2010, 2011, 2011, 2011), 
                    qtr = c(1, 1, 1, 1, 1, 2, 2, 2, 2),
                    mo = c(1, 1, 2, 3, 3, 4, 5, 5, 5), 
                    date = as.Date(c("2009-01-01", "2009-01-02","2009-02-01",
                                     "2010-03-01","2010-03-02","2010-04-01",
                                     "2011-05-01","2011-05-02","2011-05-03")),
                    x = c(10, 20, 30, 40, 50, 60, 70, 80, 90),
                    y = c(2, 4, 6, 8, 10, 12, 14, 16, 18),
                    z = c(1, 3, 5, 7, 9, 11, 13, 15, 17)))
df %>%
    select(yr, mo, x:z) %>%
    group_by(yr, mo) %>%
    summarize_each(funs(mean)) %>%
    arrange(desc(yr), desc(mo))

Source: local data frame [5 x 5]
Groups: yr [3]

 yr    mo     x     y     z
(dbl) (dbl) (dbl) (dbl) (dbl)
1  2009     2    30     6     5
2  2009     1    15     3     2
3  2010     4    60    12    11
4  2010     3    45     9     8
5  2011     5    80    16    15

如果我删除“desc(yr)”并只在安排() 函数中使用“yr”,我会得到相同的结果。

df %>%
      select(yr, mo, x:z) %>%
      group_by(yr, mo) %>%
      summarize_each(funs(mean)) %>%
      arrange(yr, desc(mo))

Source: local data frame [5 x 5]
Groups: yr [3]

 yr    mo     x     y     z
(dbl) (dbl) (dbl) (dbl) (dbl)
1  2009     2    30     6     5
2  2009     1    15     3     2
3  2010     4    60    12    11
4  2010     3    45     9     8
5  2011     5    80    16    15

如果我删除“desc(mo)”并在排列函数中只使用“mo”,我会得到预期的结果,并且数据按“mo”升序排序。

df %>%
      select(yr, mo, x:z) %>%
      group_by(yr, mo) %>%
      summarize_each(funs(mean)) %>%
      arrange(yr, mo)

Source: local data frame [5 x 5]
Groups: yr [3]

 yr    mo     x     y     z
(dbl) (dbl) (dbl) (dbl) (dbl)
1  2009     1    15     3     2
2  2009     2    30     6     5
3  2010     3    45     9     8
4  2010     4    60    12    11
5  2011     5    80    16    15

为什么“yr”变量不会响应 desc() 函数而“mo”变量会?如何让结果按“yr”降序排序,然后按“mo”降序排序?谢谢!

【问题讨论】:

    标签: r sorting dplyr


    【解决方案1】:

    看起来分组干扰了排列。

    尝试添加ungroup()

    df %>%
      select(yr, mo, x:z) %>%
      group_by(yr, mo) %>%
      summarise_each(funs(mean)) %>%
      ungroup() %>%
      arrange(desc(yr), desc(mo))
    

    应该给你

        yr mo  x  y  z
    1 2011  5 80 16 15
    2 2010  4 60 12 11
    3 2010  3 45  9  8
    4 2009  2 30  6  5
    5 2009  1 15  3  2
    

    我认为这是你想要的:yrmo 降序。

    【讨论】:

    • 谢谢!这行得通。但是,我对取消分组的需要感到困惑。根据 http://stackoverflow.com/questions/21736956/can-i-switch-the-grouping-variable-in-a-single-dplyr-statement 中的 cmets,在使用新的 dplyr 包进行 mutate / summarize 操作后不再需要取消分组。在当前情况下是否需要取消分组,因为我使用的是 summarize_each 而不是 summarize
    • 在观看此 dplyr 教程(视频的第 22 分钟左右)https://www.youtube.com/watch?v=2mh1PqfsXVI 时想通了。当按 2 个或更多变量分组时,在 mutate/summarize 命令之后仅删除最后一个变量。因此需要ungroup 命令。如果我只按 1 个变量分组,则不需要 ungroup 命令。
    • 啊!很高兴找到官方原因!感谢您的跟进。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-13
    • 2023-02-02
    • 2022-10-12
    • 1970-01-01
    • 2021-05-05
    • 2022-01-05
    相关资源
    最近更新 更多