首页 > 解决方案 > R:使 group_by 和 summarise 更有效率

问题描述

我有一个名为data列标题Region20062007等的数据集,直到2020. 该region列给出了该地区的名称,而年份列给出了该年的人口。例如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

解决方案


我们可以summarise使用across

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)

推荐阅读