mutate和across()配合可用于在dplyr數(shù)據(jù)處理管道(%>%)中方便地選擇多列進(jìn)行相應(yīng)的函數(shù)處理,從而避免了數(shù)據(jù)處理過程中管道外使用lapply或循環(huán)結(jié)構(gòu),有效保證代碼的整潔統(tǒng)一。
mutate() 的主要功能是創(chuàng)建新列,而且一旦創(chuàng)建就可以立即在管道符使用。
across(.cols = , .fns = )函數(shù)常用的只有兩個(gè)參數(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 或 .則是指向當(dāng)前被遍歷的列向量。
df %>% mutate(across(everything(),~ scale(.),.names = '{.col}.scale')) #對(duì)列向量進(jìn)行中心化
df %>% drop_na() %>% mutate( across(where(is.numeric), log) ) #對(duì)數(shù)化
df %>% mutate(across(c(x,y), ~quantile(.,0.95,na.rm = TRUE), .names = '{.col}_quantitle') ) #計(jì)算列向量0.95分位數(shù)
df %>% mutate(across(everything(),~ .x / sum(.x, na.rm = TRUE))) #計(jì)算列向量值百分比
替換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ù)科學(xué)中的 R 語言 (bookdown.org)