R語言||干貨!tidyverse包-數(shù)據(jù)轉(zhuǎn)換dplyr包進(jìn)階

R-tidyverse包-數(shù)據(jù)轉(zhuǎn)換dplyr包進(jìn)階

R語言||干貨鸡岗!tidyverse包-數(shù)據(jù)轉(zhuǎn)換dplyr包進(jìn)階

目錄

[TOC]

簡介

Dplyr(https://dplyr.tidyverse.org/)是一種數(shù)據(jù)操作語法,提供了一組一致的動(dòng)詞沼死,幫助我們解決最常見的數(shù)據(jù)操作锡移,比如行操作(filter呕童、slice、arrange)罩抗、列操作(slelect拉庵、rename灿椅、mutate套蒂、relocate)、折疊操作(summarise)茫蛹、合并table(left_join操刀、right_join、inner_join)婴洼。查看包中的所有函數(shù):

library(dplyr)
ls('package:dplyr')
  • mutate:添加新列或者修改已存在列
  • select:選擇列變量
  • filter:依據(jù)值過濾行
  • summarise:將多個(gè)值降為單個(gè)summary
  • arrange:行排序
  • left_join:合并兩個(gè)數(shù)據(jù)框
image.png

mutate函數(shù)介紹

常規(guī)用法

library(tidyverse) # or library(dplyr)

# 創(chuàng)建新列骨坑,一列或多列
starwars %>%
  select(name, mass) %>%
  mutate(
    mass2 = mass * 2,
    mass2_squared = mass2 * mass2, .before=name, # .before和.after設(shè)置新列插入的位置
    test = 'test'
  )
  
# 創(chuàng)建新列,按行進(jìn)行統(tǒng)計(jì)
starwars %>% select(name, height, mass) %>%rowwise() %>% mutate(m = mean(c(height, mass)))

# 創(chuàng)建新列柬采,根據(jù)數(shù)值排名創(chuàng)建列
starwars %>%
  select(name, mass, homeworld) %>%
  group_by(homeworld) %>%
  mutate(rank = min_rank(desc(mass)))
  
# 刪除列欢唾,設(shè)置NULL刪除
starwars %>%
  select(name, height, mass, homeworld) %>%
  mutate(
    mass = NULL
  )

# 修改列,通過運(yùn)算符修改
starwars %>%
  select(name, height, mass, homeworld) %>%
  mutate(
    height = height * 0.0328084 # convert to feet
  )

# 修改多列粉捻,利用across函數(shù)將多列字符串?dāng)?shù)據(jù)轉(zhuǎn)換為因子
starwars %>%
  select(name, homeworld, species) %>%
  mutate(across(!name, as.factor))

# 保留或刪除列礁遣,默認(rèn)保留所有列
df <- tibble(x = 1, y = 2, a = "a", b = "b")
df %>% mutate(z = x + y, .keep = "all") # the default
df %>% mutate(z = x + y, .keep = "used")
df %>% mutate(z = x + y, .keep = "unused")
df %>% mutate(z = x + y, .keep = "none")

特殊用法

# 增加列列名為變量
col_name <- "new_column"
starwars %>% mutate(!!col_name := mass * height)

# 操作列名為變量
col_names <- c("height", "mass")
starwars %>% mutate(across(all_of(col_names), ~ .x * 2))

# 根據(jù)條件增加列
starwars %>% mutate(
  gender = case_when(
    sex == "male" ~ "Male",
    sex == "female" ~ "Female",
    TRUE ~ "Unknown"
  )
)

# 根據(jù)條件增加列,針對所有以height開頭的列肩刃,值乘10
starwars %>% mutate(across(starts_with("height"), ~.x*10), .keep='used')

# 根據(jù)條件修改列
starwars %>% mutate(
  mass = if_else(mass > 100, "Yes", "No")
)

# 根據(jù)多列條件創(chuàng)建列
starwars %>% mutate(
  special_condition = if_else(mass > 100 & height > 200, "Yes", "No")
, .keep='used')

select函數(shù)介紹

常規(guī)用法

library(tidyverse)

# For better printing
iris <- as_tibble(iris)

# 選擇列祟霍,單列或者多列
starwars %>% select(homeworld, height, mass)

# 按索引選擇列
starwars %>% select(1:3)

# 按范圍選擇列
starwars %>% select(name:mass)

# 反選,使用!或者-反選
starwars %>% select(!(name:mass))

iris %>% select(-c(Sepal.Length, Petal.Length))

# 按條件反選
iris %>% select(!ends_with("Width"))

# 按照多個(gè)條件選擇盈包,交集
iris %>% select(starts_with("Petal") & ends_with("Width"))

# 按照多個(gè)條件選擇沸呐,并集
iris %>% select(starts_with("Petal") | ends_with("Width"))

# 按照多個(gè)條件選擇,并集呢燥,其中一個(gè)條件反選
iris %>% select(starts_with("Petal") & !ends_with("Width"))

特殊用法

# 選擇列為變量
col_names <- c("Sepal.Length", "Sepal.Width")
iris %>% select(all_of(col_names))

col_names <- c("Sepal.Length", "Sepal.Width", "test") # test不在iris數(shù)據(jù)中
iris %>% select(one_of(col_names))

filter函數(shù)介紹

常規(guī)用法

# 根據(jù)單個(gè)條件選擇行
filter(starwars, species == "Human")
filter(starwars, mass > 1000)

# 根據(jù)多個(gè)條件選擇行
filter(starwars, hair_color == "none" & eye_color == "black")
filter(starwars, hair_color == "none" | eye_color == "black")
filter(starwars, hair_color == "none", eye_color == "black")

# 取反
filter(starwars, !(hair_color == "none" & eye_color == "black"))

# 根據(jù)運(yùn)算結(jié)果選擇行
starwars %>% filter(mass > mean(mass, na.rm = TRUE))
starwars %>% group_by(gender) %>% filter(mass > mean(mass, na.rm = TRUE))

# 列名為變量
vars <- c("mass", "height")
cond <- c(80, 150)
starwars %>%
  filter(
    .data[[vars[[1]]]] > cond[[1]],
    .data[[vars[[2]]]] > cond[[2]]
  )

特殊用法

# 列名為變量
col_name <- "Species"
value_to_filter <- "setosa"
filtered_iris <- iris %>% filter(!!sym(col_name) == value_to_filter)

summarise函數(shù)介紹

常規(guī)用法

# 統(tǒng)計(jì)平均值和總行數(shù)
mtcars %>%
  summarise(mean = mean(disp), n = n())

# 統(tǒng)計(jì)分組后平均值和總行數(shù)
mtcars %>%
  group_by(cyl) %>%
  summarise(mean = mean(disp), n = n())

# 列名是變量
var <- "mass"
summarise(starwars, avg = mean(.data[[var]], na.rm = TRUE))

summarise(starwars, avg = mean(!!sym(var), na.rm = TRUE))

特殊用法

# 分組崭添,合并多行為一行
iris %>%
  group_by(Species) %>% summarise(test=paste(Petal.Length, collapse=','))

# 多個(gè)函數(shù)
min_max <- list(
  min = ~min(.x, na.rm = TRUE), 
  max = ~max(.x, na.rm = TRUE)
)
starwars %>% summarise(across(where(is.numeric), min_max))

starwars %>% summarise(
  tibble(
    across(where(is.numeric), ~min(.x, na.rm = TRUE), .names = "min_{.col}"),
    across(where(is.numeric), ~max(.x, na.rm = TRUE), .names = "max_{.col}")  
  )
)

arrange函數(shù)介紹

常規(guī)用法

# 依據(jù)多行進(jìn)行排序
arrange(mtcars, cyl, disp)

# 降序排序
arrange(mtcars, desc(disp))

# 先升序,再降序
arrange(mtcars, mpg, desc(hp))

# <p style="color: red;">分組排序叛氨,必須設(shè)置.by_group參數(shù)為TRUE</p>
mtcars %>% group_by(cyl) %>% arrange(desc(wt),.by_group = TRUE) %>% print(n=32)

# 列名是變量
var <- 'mpg'
arrange(mtcars, !!sym(var))
arrange(mtcars, .data[[var]])

# 選擇多列進(jìn)行排序
iris %>% arrange(pick(starts_with("Sepal")))
iris %>% arrange(across(starts_with("Sepal"), desc))

left_join函數(shù)介紹

install.packages('nycflights13')
library(nycflights13)
flights2 <- flights %>% select(year:day, hour, origin, dest, tailnum, carrier)

# 向左合并呼渣,指定按某列合并
flights2 %>% left_join(planes, by = "tailnum")

# 按照交集合并
df1 <- tibble(x = c(1, 2), y = 2:1)
df2 <- tibble(x = c(3, 1), a = 10, b = "a")
df1 %>% inner_join(df2)

# 向右合并
df1 %>% right_join(df2)

# 按照并集合并
df1 %>% full_join(df2)

其它常用函數(shù)介紹

rename重命名列

# 修改列名
iris <- as_tibble(iris)
rename(iris, petal_length = Petal.Length)

# 修改多列列名
lookup <- c(pl = "Petal.Length", sl = "Sepal.Length")
rename(iris, all_of(lookup))

# 修改多列列名,如果列名不存在力试,使用any_of
lookup <- c(lookup, new = "unknown")
try(rename(iris, all_of(lookup)))
rename(iris, any_of(lookup))

# 切換列名大小寫徙邻,替換字符
rename_with(iris, toupper)
rename_with(iris, toupper, starts_with("Petal"))
rename_with(iris, ~ tolower(gsub(".", "_", .x, fixed = TRUE)))

# 使用paste修改列名時(shí),設(shè)置recycle0 = TRUE防止空選
rename_with(
  iris,
  ~ paste0("prefix_", .x, recycle0 = TRUE),
  starts_with("nonexistent")
)

# rlang包中的set_names
set_names(head(mtcars), paste0(colnames(mtcars), "_foo"))
set_names(head(mtcars), paste0, "_foo")

relocate調(diào)整列順序

df <- tibble(a = 1, b = 1, c = 1, d = "a", e = "a", f = "a")

# 默認(rèn)最前
df %>% relocate(f)

# 指定順序
df %>% relocate(a, .after = c)
df %>% relocate(f, .before = b)
df %>% relocate(a, .after = last_col())

# 指定順序并改名
df %>% relocate(ff = f)

# 條件選擇列
df %>% relocate(where(is.character))
df %>% relocate(any_of(c("a", "e", "i", "o", "u")))

slice選擇行

# 選擇第一行
mtcars %>% slice(1)
# 選擇尾部一行或多行
mtcars %>% slice(n())
mtcars %>% slice(5:n())
# 去除指定行
slice(mtcars, -(1:4))

# 選擇頭部或尾部指定行
mtcars %>% slice_head(n = 5)
mtcars %>% slice_tail(n = 5)

# 排序后選擇指定行
mtcars %>% slice_min(mpg, n = 5)
mtcars %>% slice_max(mpg, n = 5)

# slice_min()和slice_max()可能返回多行畸裳,因?yàn)榕判蚝笾迪嗤掷纾O(shè)置with_ties = FALSE,輸出指定行
mtcars %>% slice_min(cyl, n = 1)
mtcars %>% slice_min(cyl, n = 1, with_ties = FALSE)

# 隨機(jī)選擇行
mtcars %>% slice_sample(n = 5)
mtcars %>% slice_sample(n = 5, replace = TRUE)

# 隨機(jī)選擇行,并設(shè)置權(quán)重
mtcars %>% slice_sample(weight_by = wt, n = 5)

across選擇列

# 選擇列帅容,并用函數(shù)處理
iris %>% mutate(across(c(Sepal.Length, Sepal.Width), round))

iris %>%
       group_by(Species) %>%
       summarise(across(starts_with("Sepal"), ~ mean(.x, na.rm = TRUE)))

# 選擇列颇象,并用函數(shù)處理,并定義列名并徘。.col表示原來的列名遣钳,.fn表示函數(shù)名
iris %>%
       group_by(Species) %>%
       summarise(across(starts_with("Sepal"), list(mean, sd), .names = "{.col}.fn{.fn}"))

# 選擇列,只要某一行滿足條件即保留行
iris %>%
       filter(if_any(ends_with("Width"), ~ . > 4))

case_when條件語句

# 單列
x <- 1:70
     case_when(
       x %% 35 == 0 ~ "fizz buzz",
       x %% 5 == 0 ~ "fizz",
       x %% 7 == 0 ~ "buzz",
       .default = as.character(x)
     )

# 多列
starwars %>%
       mutate(type = case_when(
         height > 200 | mass > 200 ~ "large",
         species == "Droid" ~ "robot",
         .default = "other"
       )) %>%
       pull(type)

pull選擇列

# 選擇列麦乞,適用于一列蕴茴,生成vector,和select函數(shù)最大的不同
mtcars %>% pull(cyl)

# 選擇列姐直,生成named vector
starwars %>% pull(height, name)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末倦淀,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子声畏,更是在濱河造成了極大的恐慌撞叽,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,013評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件插龄,死亡現(xiàn)場離奇詭異愿棋,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)均牢,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,205評論 2 382
  • 文/潘曉璐 我一進(jìn)店門糠雨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人膨处,你說我怎么就攤上這事见秤。” “怎么了真椿?”我有些...
    開封第一講書人閱讀 152,370評論 0 342
  • 文/不壞的土叔 我叫張陵鹃答,是天一觀的道長。 經(jīng)常有香客問我突硝,道長测摔,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,168評論 1 278
  • 正文 為了忘掉前任解恰,我火速辦了婚禮锋八,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘护盈。我一直安慰自己挟纱,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,153評論 5 371
  • 文/花漫 我一把揭開白布腐宋。 她就那樣靜靜地躺著紊服,像睡著了一般檀轨。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上欺嗤,一...
    開封第一講書人閱讀 48,954評論 1 283
  • 那天参萄,我揣著相機(jī)與錄音,去河邊找鬼煎饼。 笑死讹挎,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的吆玖。 我是一名探鬼主播筒溃,決...
    沈念sama閱讀 38,271評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼衰伯!你這毒婦竟也來了铡羡?” 一聲冷哼從身側(cè)響起积蔚,我...
    開封第一講書人閱讀 36,916評論 0 259
  • 序言:老撾萬榮一對情侶失蹤意鲸,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后尽爆,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體怎顾,經(jīng)...
    沈念sama閱讀 43,382評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,877評論 2 323
  • 正文 我和宋清朗相戀三年漱贱,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了槐雾。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 37,989評論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡幅狮,死狀恐怖募强,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情崇摄,我是刑警寧澤擎值,帶...
    沈念sama閱讀 33,624評論 4 322
  • 正文 年R本政府宣布,位于F島的核電站逐抑,受9級特大地震影響鸠儿,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜厕氨,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,209評論 3 307
  • 文/蒙蒙 一进每、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧命斧,春花似錦田晚、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,199評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽遭京。三九已至,卻和暖如春泞莉,著一層夾襖步出監(jiān)牢的瞬間哪雕,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,418評論 1 260
  • 我被黑心中介騙來泰國打工鲫趁, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留斯嚎,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,401評論 2 352
  • 正文 我出身青樓挨厚,卻偏偏與公主長得像堡僻,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子疫剃,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,700評論 2 345

推薦閱讀更多精彩內(nèi)容