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)