mutate
和across()
配合可用于在dplyr數(shù)據(jù)處理管道(%>%)中方便地選擇多列進行相應的函數(shù)處理,從而避免了數(shù)據(jù)處理過程中管道外使用lapply或循環(huán)結構悉稠,有效保證代碼的整潔統(tǒng)一蝌麸。
mutate()
的主要功能是創(chuàng)建新列戒幔,而且一旦創(chuàng)建就可以立即在管道符使用。
across(.cols = , .fns = )
函數(shù)常用的只有兩個參數(shù)诵姜,.cols = 和 .fns = 分別指定選取用于遍歷的列變量 和 處理函數(shù)存崖。
指定列向量轉(zhuǎn)換 向量類型
df %>% mutate(across(.cols = c(x, y, z), .fns = as.character)) #將x, y, z三列轉(zhuǎn)換為字符型向量
df %>% mutate(across(.cols = 1:3, .fns = as.character) ) #改變1:3列的向量元素類型為字符型
df %>% mutate(across(.cols = everything(), .fns = as.character)) #將所有列轉(zhuǎn)換為字符型向量
str(df) #查看數(shù)據(jù)框列向量類型
將所有字符型的列向量轉(zhuǎn)換為數(shù)值型
df %>% mutate(across(where(is.character), as.numeric, .names = '{.col}.2')) ## .names 參數(shù)指定新新列名冻记,{.col}代表舊列的列名
數(shù)據(jù)表中單元值的替換
df %>% mutate(across(across(everything(), ~replace(.x, .x == "replacement" , "parttern")))
使用across()
隱函數(shù)處理列向量
注: ~
是R語言隱函數(shù)[lambda]的寫法,翻譯為代表function(x){...}
; 而 .x 或 .
則是指向當前被遍歷的列向量。
df %>% mutate(across(everything(),~ scale(.),.names = '{.col}.scale')) #對列向量進行中心化
df %>% drop_na() %>% mutate( across(where(is.numeric), log) ) #對數(shù)化
df %>% mutate(across(c(x,y), ~quantile(.,0.95,na.rm = TRUE), .names = '{.col}_quantitle') ) #計算列向量0.95分位數(shù)
df %>% mutate(across(everything(),~ .x / sum(.x, na.rm = TRUE))) #計算列向量值百分比
替換y列小于0的值為NA
df %>% mutate( across(contains("y"), ~ if_else(.x < 0, NA_real_, .x)) )
參考材料:
Why I love dplyr's across - Will Hipson
第 40 章 tidyverse中的across()之美1 | 數(shù)據(jù)科學中的 R 語言 (bookdown.org)