r - R:使 group_by 和 summarise 更有效率
问题描述
我有一个名为data
列标题Region
、2006
、2007
等的数据集,直到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)
谢谢!
解决方案
我们可以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 R
与aggregate
aggregate(. ~ Region, data[c('Region', 2006:2020)],
sum, na.rm = TRUE, na.action = NULL)
推荐阅读
- r - 将作为函数输出的列表子集,而不将输出声明为变量
- c# - 如何在 PHP 文件中接收 json 数据?
- angular - 错误:运行时编译器未加载角度 SSR Google App Engine
- ios - 使用新数据更新领域文件
- c - 从链表中的“node *”分配给“int *”的不兼容指针类型
- data-warehouse - 在数据仓库中,度量应该基于事实还是维度?
- gdb - 如何防止 Eclipse CDT/GDB 中断信号(选择系统调用)?
- c - 为什么 puts() 在 C 中的输出上打印一些垃圾值
- c++ - [Boost].SML 通关参数
- android - 无法使用 exoplayer 解析方法 getUserAgent()