dplyr 1.0 更新内容大概记录
最前面的话
2020/5/31
<br />
# devtools::install_github("tidyverse/dplyr")
library(tidyverse)
## 2020/5/31
## 可以通过以下了
install.packages("dplyr")
<a name="24239833"></a>
这次更新了什么呢?
<br />见官方链接 dplyr 1.0.0 , emm,就不一一列举了,反正进行了大规模的更新。<br />这里列举几个惊艳的功能:<br />
-
across()
:可以使我们对数据列进行相同批量处理,目的用来尽可能的取代 apply()、do() 等函数。
-
relocate()
: 更快捷的改变列的顺序
-
rowwise
: 传统的dplyr
中一般使针对列处理,有了此函数后可以对数据进行处理,比如对行求和、平均值,取代rowsum()
等函数,常常与across()
函数连用,,能更好的能够进行批量处理。
<a name="ca996b56"></a>
还是翻译一下吧,更好的了解一下:
<a name="e670ab3b"></a>
Breaking changes
-
bind_cols()
:当输入文件格式为data frame
格式时候,返回的是data frame
格式,而非tibble
格式。 -
bind_rows()、*_join()、summrise()、mutatte()
:有两点主要的改变- 将因子和字符向量合并一起后不发出警告创造一个字符串向量,之前合并的同时会发出警告
- 将多个因子合并后创造一个组合水平因子,之前是创造一个字符串向量同时会发出警告
-
bind_rows()
和其他使用向量修复向量名,详细见?vctrs::vec_as_names
-
all.equal.tbl_df()
被移除-
data frame
、tibbles
、已分组的data frame
数据即使数据一模一样也不再相等 -
data frame
数据是否相等不再忽略行排序、分组 -
expect_equal()
使用内置的all.equal()
:比较data frame
时候,以前正确的现在可能会出错
-
-
distinct()
:去重复,保持原始的列顺序 -
distinct()
:缺失列时会增加报错,一直以来之前是只警告! -
group_modify()
:将分组变量列放置在最前面,类似函数还有group_map()
、group_walk()
,详情见?group_modify()
-
n()、row_number()
:当没有加载dplyr
包时候,不能直接使用了,现在使用dplyr::mutate(mtcars, x = n())
会报错,必须得dplyr::mutate(mtcars, x = dplyr::n())
- 不再支持
grouped_df()
旧数据格式,可能会影响我们将数据存入本地,比如使用knir
缓存或者使用saveRDS()
-
lead()、lag()
函数的输入文件更加严格 - 拓展数据框需要首先添加一个或多个额外的类,而不是最后添加。将额外的类放在末尾会导致一些向量操作失败,例如:
Input must be a vector, not a
<data.frame/...>object
-
right_join()
不再根据tibble
y 中的参数按照RHS
的顺序对结果tibble
的行进行排序
<a name="4078e029"></a>
New features
-
cur_*
系列函数cur_data()、cur_group()、cur_group_id()、cur_group_rows()
受data.table()
函数中的.SD、.GRP、.BY、.I
启发,能更方便的访问有关dplyr
“当前”组的信息。 -
row_*
系列函数rows_insert()、rows_update()、rows_upsert()、rows_patch()、rows_delete()
提供一个新的 API 来插入和删除来自第二个数据框或表的行。
-
mutate()、summrise()
:如果返回一个数据框,可以从单个表达式创建多个列
-
select()、rename()
使用最新的tidyselect
接口;现在支持布尔逻辑运算(例如:! & |
),可以结合where()
函数按照类型来进行选择列(比如:where(is.character)
(upgrade select() to new tidyselect )[https://github.com/tidyverse/dplyr/issues/4680]),还可以用来修复具有重复的列名的数据。 -
slice()
增加了以下几个子函数:-
slice_head()、slice_tail()
:选择第一列或者最后一列,类似head()
和tail()
,但是返回每一个组的行数 -
slice_sample()
:随机选择行,接替sample_n()
和sample_frac()
-
slice_min()、slice_max()
:选择最小值和最大值,接替令人困惑的函数top_n()
-
-
summrise()
:增加参数.groups =
以便于更好的控制分组 -
relocate()
:增加的新函数,更方便的调整数据列顺序
-
rename_with()
:增加的新函数,可以用函数来冲命名列名。
-
ungroup()
:可以选择性的移除分组变量
-
pull()
:现在可以通过指定一个额外的列名返回指定的向量
<a name="59c5b601"></a>
Experimental features
-
mutate()
:仅适用于data frame
,增加新参数.before
和.after
可以控制新增加的列的位置
-
mutate()
:仅适用于data frame
, 增加了新参数.kepp
参数可以控制保持数据.data
中哪些列,.kepp = "all"
默认;.keep = "none"
不保留输入变量,类似tranmute()
函数;.keep = "used"
仅保留用于创建新列的变量。
morph() to automatically remove columns "used up" by a mutate()
-
with_groups()
:方便临时分组或者取消分组
<a name="960ea0eb"></a>
across()
-
across()
:新增函数;能够在函数summrise()、mutate()
和其他将一个函数(或一组函数)应用于选定的列的函数,详情见vignette("colwise")
-
c_across()
:新增函数;同across()
函数,使得在行处理更加方便,比如:求每一行的平均值,见vignette("rowwise")
。
<a name="ccb4fdd8"></a>
rowwise()
-
rowwise()
:允许指定在以下情况下应保留在输出中的其他变量 summarising 。所有操作都会保留按行顺序
-
nest_by()
:它具有与group_by()
相同的接口,但会返回分组键的行数据框,并以包含其余数据的数据框的列表列,即返回分组的列表。
<a name="vctrs"></a>
vctrs
-
vctrs
:向量帮助文档,详情见?vctrs
。简单记录两点:- 舍弃了两个最重要的依赖:
Rcpp
和BH
- 处理数据框 data frame 数据时候保留行名
- 舍弃了两个最重要的依赖:
<a name="Grouping"></a>
Grouping
-
group_by()
使用来自包vctrs()
中的哈希算法 - 已分组的数据框现在可以通过
names<-、[[<-、 [<- 、$<-
来重新生成底层分组。 -
.grouped_df()
:重新分组
-
mutate()、summarise()
现在可以调整分组变量
-
group_modify()
新增了额外的参数
-
group_by()
:当按drop = TRUE
的因子分组时,不创建任意的 NA 组
False positive implicit NA warning with factors and 0-row slices
<a name="ba5a9bcd"></a>
Lifecycle changes
- 不推荐使用 lifecycle
- 也就是说,默认情况下,每个会话只会看到一次弃用警告, 您可以使用
options(lifecycle_verbosity = x)
进行控制,其中 x 是NULL, "quiet", "warning", and "error"
之一。
- 也就是说,默认情况下,每个会话只会看到一次弃用警告, 您可以使用
<a name="Removed"></a>
Removed
-
id()
函数 -
failwith()
函数 -
tbl_cube()
函数 -
rbind_all()
函数 -
rbind_list()
函数 -
dr_dplyr()
函数
<a name="Deprecated"></a>
Deprecated
-
add_count()
函数中的drop
参数 -
add_rownames
函数已经被tibble::rownames_to_column()
取代 -
as.tbl() 和 tbl_df()
函数已经被as_tibble()
取代 -
bench_tbls()、compare_tbls()、compare_tbls2()、eval_tbls() and eval_tbls2()
函数已弃用 -
combine()
函数已经被vctrs::vec_c()
取代 -
funs()
函数已经被list()
取代 -
group_by(add = )
已经被group_by(.add = )
取代 -
group_by(.dots = )/group_by_prepare(.dots = )
已经被!!!
取代
-
location() 和 changes()
函数已被lobstr::ref()
取代 -
src_loacl
函数已弃用 -
src_mysql()、 src_postgres()、src_sqlite()
函数已弃用- 推荐使用
dbplyr
包:dbplyr,自动将数据转变为SQL
- 推荐使用
<a name="Superseded"></a>
Superseded
-
_if _at _all
等系列变体函数已经被across()
函数取代。
-
rename_*()、select_*()
已经被rename_with()
取代 -
do()
被summarise()
取代 -
top_n()
被slice_min()
和 slice_max()
取代
<a name="Questioning"></a>
Questioning
-
all_equal()
解决了一个似乎不再重要的问题
<a name="Stable"></a>
Stable
-
rowwise()
is no longer questioning.
<a name="7dfebbeb"></a>
Documentation improvements
-
vignette("base)
简述了dplyr
与base R
的异同
[https://cran.r-project.org/web/packages/dplyr/vignettes/base.html](dplyr <-> base R)
-
vignette("grouping")
介绍了当应用于分组数据时候,dplyr 怎么变化的。
-
vignette("programming")
已经完全重写,以反映最新的词汇表、最新的rlang
特性和当前的建议。现在用dplyr
编程应该会简单很多。
- 更多关于
dplyr
的帮助说明书见 dplyr/vignettes<br />
<a name="10cfcd06"></a>
Minor improvements and bug fixes
?dplyr_extending
-
dplyr
不再提供all.equal.tbl_df()
方法。 coalesce()
-
distinct()
在处理不存在的变量时候会报错,之前是警告 -
filter()、mutate()、summarise()
提供了更详细的报错信息 - 当所有列均为逻辑向量时,
filter()
处理数据框结果通过用&
减少它们。意味着我们可以结合across
与filter()
函数
-
left_join()、right_join()、full_join()
增加了新参数kepp
,可以选择保留这两组连接键。当我们想要确定哪一行在每一个数据丢失时非常有用。
-
*join()
函数增加了by = character()
来进行数据合并
[https://github.com/tidyverse/dplyr/issues/4206](Problems writing cross-join in dplyr)
-
group_by(..., .add = TRUE)
取代了group_by(..., add = TRUE)