【问题标题】:R: making group_by and summarise more efficient [duplicate]R:使group_by和summary更有效率[重复]
【发布时间】:2020-09-09 15:05:23
【问题描述】:

我有一个名为data 的数据集,其列标题为Region20062007,以此类推,直到2020region 列给出了该地区的名称,而年份列给出了该年的人口。例如,2006 列出了特定地区当年的人口,2007 列出了特定地区当年的人口等等。

下面的代码给出了我想要的输出(它显示了按地区划分的每年的总人口)。但是,输入此代码非常耗时。有没有办法让这段代码更高效并节省输入 15 行不同的代码的时间?

newData <- data %>%
  group_by(Region) %>%
  summarise(totalPop2006 = sum(`2006`, na.rm = TRUE), 
            totalPop2007 = sum(`2007`, na.rm = TRUE),
            totalPop2008 = sum(`2008`, na.rm = TRUE),
            totalPop2009 = sum(`2009`, na.rm = TRUE),
            totalPop2010 = sum(`2010`, na.rm = TRUE),
            totalPop2011 = sum(`2011`, na.rm = TRUE),
            totalPop2012 = sum(`2012`, na.rm = TRUE),
            totalPop2013 = sum(`2013`, na.rm = TRUE),
            totalPop2014 = sum(`2014`, na.rm = TRUE),
            totalPop2015 = sum(`2015`, na.rm = TRUE),
            totalPop2016 = sum(`2016`, na.rm = TRUE),
            totalPop2017 = sum(`2017`, na.rm = TRUE),
            totalPop2018 = sum(`2018`, na.rm = TRUE),
            totalPop2019 = sum(`2019`, na.rm = TRUE),
            totalPop2020 = sum(`2020`, na.rm = TRUE)       
            ) %>%
  ungroup() %>%
  arrange(Region)

谢谢!

【问题讨论】:

    标签: r


    【解决方案1】:

    我们可以使用summariseacross

    library(dplyr)
    data %>%
       group_by(Region) %>% 
       summarise(across(`2006`:`2020`, ~ sum(., na.rm = TRUE),
                 .names = 'totalPop{col}'), .groups = 'drop') %>%
       arrange(Region)
    

    使用默认数据集“mtcars”

    data(mtcars)
    mtcars %>%
         group_by(cyl) %>%
         summarise(across(disp:wt, ~ sum(., na.rm = TRUE), .names = 'totalPop{col}'), 
              .groups = 'drop')
    # A tibble: 3 x 5
    #    cyl totalPopdisp totalPophp totalPopdrat totalPopwt
    #  <dbl>        <dbl>      <dbl>        <dbl>      <dbl>
    #1     4        1156.        909         44.8       25.1
    #2     6        1283.        856         25.1       21.8
    #3     8        4943.       2929         45.2       56.0
    

    或者在base Raggregate

    aggregate(. ~ Region, data[c('Region', 2006:2020)],
             sum, na.rm = TRUE, na.action = NULL)
    

    【讨论】:

    • .names 中是否需要 {col}?我还没有学会这种方法。感谢您展示它。
    • @jazzurro 默认情况下,across 返回原始列名。在这里,OP 可能需要修改列名。前缀“totalPop”与原始列名 {col} 一起添加。通过使用{col},我们可以修改前缀或后缀,也可以通过将 {col} 放在中间来修改两者
    猜你喜欢
    • 2019-09-01
    • 1970-01-01
    • 2021-11-06
    • 2021-04-17
    • 2023-03-24
    • 2021-10-11
    • 1970-01-01
    • 2014-04-13
    • 2023-03-22
    相关资源
    最近更新 更多