r语言函数dplyr_穿越Dplyr:首先看一下新的Tidyverse函数

r语言函数dplyr

按列分析数据是R的一大优势。 但是,如果您是Tidyverse用户,并且想要跨多个列运行一个函数,该怎么办?

从dplyr 1.0开始,将为此提供一个新功能:cross across(). 让我们来看看。

当本文发表时,dplyr 1.0在CRAN上尚不可用。 但是,通过使用以下命令下载dplyr的开发版本,您可以访问所有新功能:

remotes::install_github("tidyverse/dplyr")

在此演示中,我将使用一些数据显示COVID-19的传播情况:USA Facts确认的美国病例数(按日和县)。 如果您想继续学习,可以在https://usafacts.org/visualizations/coronavirus-covid-19-spread-map/中找到有关数据的更多信息,并在此处下载CSV文件 。 只要您将USA Facts归功于任何已发表的作品(如我刚才所做的那样),就可以通过知识共享许可免费获得USA Facts数据。

我将在dplyr和readr包中加载

library(dplyr)
library(readr)

请记住,我正在加载dplyr的开发版本。 这不适用于CRAN版本。

接下来,我将读入我下载的文件(我将其命名为covid19_cases_by_county.csv;您的文件可能被命名为其他名称)。

cases <- read_csv("covid19_cases_by_county.csv")

如果使用head(cases)查看数据框结构,则会看到每个县都是一行,每个日期都是一列。 这不是一个整洁的数据集,但确实可以作为使用across()一个很好的例子。

数据框结构 沙龙·马克斯(IDG)

初始不整洁的数据帧结构。


接下来,我将对3月和4月仅纽约州的数据进行子集化,以使结果更易于查看。 我将通过过滤状态等于NY以及以3或4开头的列名称的方式来做到这一点。

ny <- filter(cases, State == "NY") %>%
select(County = `County Name`, starts_with(c("3", "4")))

通常,如果我想获取每天的总数,则可以调整数据的形状或使用诸如janitor之类的包来添加总数行。 但是,如果我想使用这种格式的单独的摘要数据帧,现在可以使用across()

那么,什么 across() 我认为它是“在每一列上一次执行一个功能。” 它使您不必一一命名每一列或使用purrr()映射函数来执行此操作。

这是“给我该数据帧中每个数字列的总和”的代码。

daily_totals <- ny %>%
summarize(
across(is.numeric, sum)
)

daily_totals <- ny %>% across()的第一个参数应该是数据框,但是在顶部使用了daily_totals <- ny %>%这里的第一个参数的across()是被操作的列。 这需要任何dplyr::select()语法。 我也可以给定范围的列而不是is.numeric ,例如

daily_totals <- ny %>%
summarize(
across(2:ncol(ny), sum)
)

或者,我可以使用starts_with()

daily_totals <- ny %>%
summarize(
across(starts_with("4"), sum)
)

across()允许使用类似的代码在每列上运行多个函数。 例如,如果我想查看每天的最大值中位数怎么办? 如果创建命名函数列表 ,则可以一次应用列表中的每个函数。

下面的代码使用两个函数创建一个列表平均数和最大值。 med是中位数(除去所有缺失值); 另一个max表示最大值,再次删除缺失值。

median_and_max <- list(
med = ~median(.x, na.rm = TRUE),
max = ~max(.x, na.rm = TRUE)
)

注意,定义每个命名函数都需要一个~波浪号。

下面是在四月份的所有列中的列表中运行每个功能的代码:

april_median_and_max <- ny %>%
summarize(
across(starts_with("4"), median_and_max)
)

结果:每个日期列现在都有列! ...一个中位数,另一个最大。

tib在具有多个函数的命名列表的情况下跨过()运行的结果。 沙龙·马克斯(IDG)

使用具有多个功能的命名列表运行across()结果。

那不是最整洁的数据格式,但是我们生活在一个人们有时希望他们感到更易理解的结构的世界中。 现在,您可以生成基于列的结果,而无需重新整形数据。

欲了解更多的新across()函数,检查出Tidyverse博客文章 -约第二后使用across()按行与rowwise() 有关更多R技巧,请访问InfoWorld“使用R进行更多操作”页面

翻译自: https://www.infoworld.com/article/3537612/dplyr-across-first-look-at-a-new-tidyverse-function.html

r语言函数dplyr

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值
>