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()
一个很好的例子。
接下来,我将对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)
)
结果:每个日期列现在都有两列! ...一个中位数,另一个最大。
那不是最整洁的数据格式,但是我们生活在一个人们有时希望他们感到更易理解的结构的世界中。 现在,您可以生成基于列的结果,而无需重新整形数据。
欲了解更多的新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