之前一直不知道該如何學(xué)R单寂,一直用
awk
等命令進(jìn)行數(shù)據(jù)處理贬芥。
最開始看的《R語言實(shí)戰(zhàn)》,了解了工作目錄宣决,數(shù)據(jù)類型蘸劈,數(shù)據(jù)結(jié)構(gòu)等;
后來看《R數(shù)據(jù)科學(xué)》(網(wǎng)上可搜中文版pdf尊沸,英文網(wǎng)頁版)威沫;
練習(xí)題,搜到了張敬信老師的 玩轉(zhuǎn)數(shù)據(jù)處理120題之P1-P20(R語言tidyverse版本)洼专,有更新版棒掠,《R語言編程—基于tidyverse》新書信息匯總;
教程屁商?網(wǎng)上搜tidyverse
烟很、readr
、tibble
蜡镶、dplyr
雾袱、stringr
、tidyr
官还、purrr
芹橡、forcats
......應(yīng)有盡有!
數(shù)據(jù)處理望伦,學(xué)好tidyverse
的幾個(gè)核心包的核心函數(shù)林说,應(yīng)該就差不多了吧 ~ ~ ~
補(bǔ)充:老板讓學(xué)的 quick-R
補(bǔ)充:tidyverse
的幾個(gè)核心包的主要函數(shù)
> library(tidyverse)
-- Attaching packages ----------------------- tidyverse 1.3.1 --
√ ggplot2 3.3.5 √ purrr 0.3.4
√ tibble 3.1.5 √ dplyr 1.0.7
√ tidyr 1.1.4 √ stringr 1.4.0
√ readr 2.0.2 √ forcats 0.5.1
-- Conflicts -------------------------- tidyverse_conflicts() --
x dplyr::filter() masks stats::filter()
x dplyr::lag() masks stats::lag()
1. tibble
data.frame
煎殷、data.table
、tibble
library(tibble)
# library(tidyverse)
-
tibble()
: 創(chuàng)建tibble
腿箩,不改變輸入的類型豪直、變量的名稱,也不創(chuàng)建行名稱 -
tribble()
:transposed tibble
的縮寫度秘, 創(chuàng)建tibble的另一種方法 -
as_tibble()
: 將數(shù)據(jù)框轉(zhuǎn)換為tibble -
df$x
顶伞、df[["x"]]
、df %>% .$x
剑梳、df %>% .[["x"]]
: 按名稱提取x
列元素組成向量 -
df[[1]]
: 按位置提取第1
列元素組成的向量
df <- tibble(
`>` = 1:5,
`100` = 1,
a = c("one", "two", "three", "four", "five"),
`:)` = `>` * `100` + str_length(a),
)
df
# # A tibble: 5 x 4
# `>` `100` a `:)`
# <int> <dbl> <chr> <dbl>
# 1 1 1 one 4
# 2 2 1 two 5
# 3 3 1 three 8
# 4 4 1 four 8
# 5 5 1 five 9
> tribble(
~`<`, ~`100`,
"a", 1,
"b", 1,
)
# # A tibble: 2 x 2
# `<` `100`
# <chr> <dbl>
# 1 a 1
# 2 b 1
> df$`100` # 特殊字符唆貌,加反引號(hào)
[1] 1 1 1 1 1
> df[[">"]] # 雖然是特殊字符,但仍加雙引號(hào)
[1] 1 2 3 4 5
> mpg %>% colnames() # tibble不換行顯示垢乙,所以會(huì)顯示不全锨咙,要輸出tibble行名,可以直接使用基礎(chǔ)函數(shù) colnames()
[1] "manufacturer" "model" "displ" "year" "cyl"
[6] "trans" "drv" "cty" "hwy" "fl"
[11] "class"
-
rownames_to_column()
: 行名轉(zhuǎn)列追逮,個(gè)人感覺非常有用酪刀,不喜歡導(dǎo)入數(shù)據(jù)時(shí)第一列被自動(dòng)轉(zhuǎn)換成列名 -
rowid_to_column()
: 行號(hào)轉(zhuǎn)列 -
column_to_rownames()
: 列轉(zhuǎn)列名 -
has_rownames()
: 判斷是否有列名 -
remove_rownames()
: 移除列名
> mtcars %>% has_rownames()
[1] TRUE
> mtcars %>% remove_rownames() %>% has_rownames()
[1] FALSE
> mtcars %>% rownames_to_column("car") %>% head()
car mpg cyl disp hp drat wt qsec vs am gear carb
1 Mazda RX4 21.0 6 160 110 3.90 2.620 16.46 0 1 4 4
2 Mazda RX4 Wag 21.0 6 160 110 3.90 2.875 17.02 0 1 4 4
3 Datsun 710 22.8 4 108 93 3.85 2.320 18.61 1 1 4 1
4 Hornet 4 Drive 21.4 6 258 110 3.08 3.215 19.44 1 0 3 1
5 Hornet Sportabout 18.7 8 360 175 3.15 3.440 17.02 0 0 3 2
6 Valiant 18.1 6 225 105 2.76 3.460 20.22 1 0 3 1
2. readr
R基礎(chǔ)包
read.csv()
、read.tsv()
钮孵、read.delim()
readr包骂倘,更快,生成tibble
巴席,不使用行名稱......
library(readr)
# library(tidyverse)
-
read_csv()
: 讀取逗號(hào)分隔文件
skip
: 傳遞數(shù)值历涝,等于2
時(shí),跳過前2
行
comment
: 傳遞字符漾唉,等于#
時(shí)荧库,丟棄所有以#
開頭的行
col_names
: 1. 傳遞邏輯,是否將第一行作為列標(biāo)題赵刑,False
時(shí)分衫,將各列一次標(biāo)注為X1至Xn;2. 傳遞字符向量般此,作為列名稱
na
: 可以設(shè)定哪個(gè)值或哪些值作為缺失值 -
read_tsv()
: 讀取制表符分隔文件 -
read_delim()
: 讀取任意分隔文件 -
read_fwf()
: 讀取固定寬度文件 -
readsl
: 讀取Excel文件(.xls和.xlsx均可) -
write_csv()
蚪战、write_tsv()
: 寫出文件 -
write_excel_csv()
: 將CSV文件導(dǎo)出為Excel文件
3. dplyr
3.1 匯總操作
-
count()
: 類似于Shell
中輸出某幾列后sort | uniq -c
-
group_by()
: 可以按某一或幾列進(jìn)行分組
> mpg %>% group_by(manufacturer,model) %>% count()
# A tibble: 38 × 3
# Groups: manufacturer, model [38]
manufacturer model n
<chr> <chr> <int>
1 audi a4 7
2 audi a4 quattro 8
3 audi a6 quattro 3
4 chevrolet c1500 suburban 2wd 5
5 chevrolet corvette 5
6 chevrolet k1500 tahoe 4wd 4
7 chevrolet malibu 5
8 dodge caravan 2wd 11
9 dodge dakota pickup 4wd 9
10 dodge durango 4wd 7
# … with 28 more rows
-
summarise()
: 默認(rèn)每行一個(gè)分組進(jìn)行統(tǒng)計(jì)描述 -
group_by() %>% summarise()
: 常搭配使用
> mtcars %>% select(cyl, vs) %>% add_count(cyl, sort=TRUE) # `sort`: 等于`TRUE`時(shí),按次數(shù)多少從大到小排序恤煞;mtcars %>% add_count(cyl) 用于添加一列次數(shù)
# A tibble: 32 x 3
cyl vs n
<dbl> <dbl> <int>
1 8 0 14
2 8 0 14
3 8 0 14
4 8 0 14
5 8 0 14
6 8 0 14
7 8 0 14
8 8 0 14
9 8 0 14
10 8 0 14
# ... with 22 more rows
> mtcars %>% group_by(cyl) %>% summarise(count=n(),mean_disp=mean(disp))
# A tibble: 3 x 3
cyl count mean_disp
<dbl> <int> <dbl>
1 4 11 105.
2 6 7 183.
3 8 14 353.
base包的幾個(gè)累積計(jì)算函數(shù)屎勘,
dplyr
擴(kuò)充了幾個(gè)。
-
cummax()
: 累積最大值 -
cummin()
: 累積最小值 -
cumsum()
: 累積求和 -
cumprod()
: 累積求積 -
dplyr::cummean()
: 累積求平均值
> tibble(a=1:5, b=6:10) %>%
pivot_longer(everything(), names_to="Type",values_to="Num") %>%
arrange(Type) %>%
group_by(Type) %>%
mutate(Cumsum=cumsum(Num))
# A tibble: 10 × 3
# Groups: Type [2]
Type Num Cumsum
<chr> <int> <int>
1 a 1 1
2 a 2 3
3 a 3 6
4 a 4 10
5 a 5 15
6 b 6 6
7 b 7 13
8 b 8 21
9 b 9 30
10 b 10 40
3.2 行操作
-
filter()
: 篩選行
關(guān)系:<
居扒、<=
、>
丑慎、>=
喜喂、==
瓤摧、!=
、is.na()
玉吁、!is.na()
邏輯:&
照弥、|
、!
进副、xor()
此外也要注意:between()
这揣、%in%
、near()
......
> a=c("audi","dodge","honda")
> mpg %>% filter(manufacturer %in% a) %>% group_by(manufacturer) %>% count()
# A tibble: 3 × 2
# Groups: manufacturer [3]
manufacturer n
<chr> <int>
1 audi 18
2 dodge 37
3 honda 9
-
distinct()
: 去除重復(fù)行
> mpg %>% select(manufacturer) %>% distinct()
# A tibble: 15 × 1
manufacturer
<chr>
1 audi
2 chevrolet
3 dodge
4 ford
5 honda
6 hyundai
7 jeep
8 land rover
9 lincoln
10 mercury
11 nissan
12 pontiac
13 subaru
14 toyota
15 volkswagen
-
slice()
: 按位置選擇行
> mpg %>% select(manufacturer) %>% distinct() %>% slice(c(1,1,3,5)) %>% .[[1]]
[1] "audi" "audi" "dodge" "honda"
-
sample_n
: 隨機(jī)抽取n行數(shù)據(jù)
> mpg %>% select(manufacturer) %>% distinct() %>% sample_n(3,replace = F) %>% .[[1]]
[1] "audi" "toyota" "dodge"
-
slice_sample()
: 隨機(jī)抽取一行數(shù)據(jù)
> mpg %>% slice_sample()
# A tibble: 1 × 11
manufacturer model displ year cyl trans drv cty hwy fl class
<chr> <chr> <dbl> <int> <int> <chr> <chr> <int> <int> <chr> <chr>
1 ford f150 pick… 4.2 1999 6 auto(… 4 14 17 r pick…
-
arrange()
: 對(duì)行排序 add_row()
3.3 列操作
-
pull
: 提取列影斑,返回向量给赞,不能提取多列
> mpg %>% pull(year) %>% unique() # 基礎(chǔ)函數(shù)unique(),用于向量去重
[1] 1999 2008
-
select()
: 篩選列
starts_with()
矫户、ends_with()
片迅、contains()
: 字面意義
matches()
: 匹配正則表達(dá)式
everything()
: 所有的列。把特定列放到前面后皆辽,剩下的列用everything()統(tǒng)一放置
:
: 切片取列
-
: 刪除某列
注意使用!
柑蛇,&
,|
......
> mpg %>% select((!starts_with(c("m","d","y")) | matches("m.*er")))
# A tibble: 234 × 7
cyl trans cty hwy fl class manufacturer
<int> <chr> <int> <int> <chr> <chr> <chr>
1 4 auto(l5) 18 29 p compact audi
2 4 manual(m5) 21 29 p compact audi
3 4 manual(m6) 20 31 p compact audi
4 4 auto(av) 21 30 p compact audi
5 6 auto(l5) 16 26 p compact audi
6 6 manual(m5) 18 26 p compact audi
7 6 auto(av) 18 27 p compact audi
8 4 manual(m5) 18 26 p compact audi
9 4 auto(l5) 16 25 p compact audi
10 4 manual(m6) 20 28 p compact audi
# … with 224 more rows
-
relocate()
: 將列移動(dòng)到新的位置 -
across()
: 以相同的方式匯總或改變多個(gè)列 c_across()
-
mutate()
: 新增列
配合函數(shù)case_when()
驱闷、coalesce()
耻台、if_else()
、na_if()
使用
> tibble(a=1:5, b=6:10) %>% mutate(If2=if_else(b/a==2,"T","F"))
# A tibble: 5 × 3
a b If2
<int> <int> <chr>
1 1 6 F
2 2 7 F
3 3 8 F
4 4 9 F
5 5 10 T
-
transmute()
: 只保留新增的列
> mpg %>% transmute(mm=str_c(manufacturer, "__", model))
# A tibble: 234 × 1
mm
<chr>
1 audi__a4
2 audi__a4
3 audi__a4
4 audi__a4
5 audi__a4
6 audi__a4
7 audi__a4
8 audi__a4 quattro
9 audi__a4 quattro
10 audi__a4 quattro
# … with 224 more rows
-
rename
,rename_with()
: 修改列名
3.4 多個(gè)數(shù)據(jù)框操作
-
left_join()
此外空另,right_join()
盆耽、inner_join()
、full_join()
by = c()
bind_cols()
bind_rows()
-
intersect()
: 多個(gè)數(shù)據(jù)框共有的行 -
setdiff()
: 多個(gè)數(shù)據(jù)框非共有的行 -
union()
: 合并數(shù)據(jù)框后去重
4. tidyr
自我認(rèn)為
pivot_wider()
痹换、pivot_longer()
是tidyr最重要的兩個(gè)函數(shù)征字,其他的函數(shù)可以配合使用dplyr和stringr達(dá)到相同的效果。
-
pivot_wider()
: 長變寬 -
pivot_longer()
: 寬變長
> mpg %>% group_by(model, year) %>% count() %>%
pivot_wider(id_cols=model, names_from=year, values_from=n, names_prefix = "year_")
# A tibble: 38 × 3
# Groups: model [38]
model year_1999 year_2008
<chr> <int> <int>
1 4runner 4wd 4 2
2 a4 4 3
3 a4 quattro 4 4
4 a6 quattro 1 2
5 altima 2 4
6 c1500 suburban 2wd 1 4
7 camry 4 3
8 camry solara 4 3
9 caravan 2wd 6 5
10 civic 5 4
# … with 28 more rows
> mpg %>% group_by(model, year) %>% count() %>%
pivot_wider(id_cols=model, names_from=year, values_from=n, names_prefix = "year_") %>%
pivot_longer(-model, names_to="year",values_to="count")
# A tibble: 76 × 3
# Groups: model [38]
model year count
<chr> <chr> <int>
1 4runner 4wd year_1999 4
2 4runner 4wd year_2008 2
3 a4 year_1999 4
4 a4 year_2008 3
5 a4 quattro year_1999 4
6 a4 quattro year_2008 4
7 a6 quattro year_1999 1
8 a6 quattro year_2008 2
9 altima year_1999 2
10 altima year_2008 4
# … with 66 more rows
-
expand()
: 提取列娇豫,并給出所有可能的組合情況 complete()
> mtcars %>% expand(cyl)
# A tibble: 3 × 1
cyl
<dbl>
1 4
2 6
3 8
> mtcars %>% expand(cyl, vs)
# A tibble: 6 × 2
cyl vs
<dbl> <dbl>
1 4 0
2 4 1
3 6 0
4 6 1
5 8 0
6 8 1
-
unite()
: 合并列 -
separate()
: 拆分列 -
separate_rows()
: 把列拆成行
-
drop_na()
: 刪除指定列含有缺失值的行 -
fill()
: 缺失值填充 -
replace_na()
: 指定列缺失值替換
5. stringr
5.1 檢測匹配
str_detect()
str_starts()
str_which()
str_locate()
str_count()
> mpg %>%
mutate(newcol=if_else(str_detect(trans, "auto"), "A", "M")) %>%
group_by(newcol) %>%
count()
# A tibble: 2 × 2
# Groups: newcol [2]
newcol n
<chr> <int>
1 A 157
2 M 77
5.2 字符提取
-
str_sub()
: 提取字符的指定區(qū)段 -
str_subset()
: 提取匹配的字符 str_extract()
str_extract_all()
str_match()
5.3 字符長度
-
str_length()
: 返回字符串長度 -
str_pad()
: 填充字符到一定長度 -
str_trunc()
: 截?cái)嘧址揭欢ㄩL度 -
str_trim()
: 去除字符開頭和末尾的空白 -
str_squish()
: 減少字符中重復(fù)的空格
5.4 字符替換
-
str_replace()
: 替換每個(gè)字符串的首個(gè)匹配的字符 -
str_replace_all()
: 替換每個(gè)字符串所有匹配的字符 -
str_to_lower()
: 所有字母小寫 -
str_to_upper()
: 所有字母大寫 -
str_to_title()
: 每個(gè)字符的第一個(gè)字母大寫匙姜,剩下小寫 -
str_to_sentence()
: 第一個(gè)字符的第一個(gè)字母大寫,剩下小寫
5.5 組合切割
str_c()
> mpg %>%
mutate(a=str_c(manufacturer, model, sep="-")) %>%
select(a,everything())
# A tibble: 234 × 12
a manufacturer model displ year cyl trans drv cty hwy fl
<chr> <chr> <chr> <dbl> <int> <int> <chr> <chr> <int> <int> <chr>
1 audi-a4 audi a4 1.8 1999 4 auto(… f 18 29 p
2 audi-a4 audi a4 1.8 1999 4 manua… f 21 29 p
3 audi-a4 audi a4 2 2008 4 manua… f 20 31 p
4 audi-a4 audi a4 2 2008 4 auto(… f 21 30 p
5 audi-a4 audi a4 2.8 1999 6 auto(… f 16 26 p
6 audi-a4 audi a4 2.8 1999 6 manua… f 18 26 p
7 audi-a4 audi a4 3.1 2008 6 auto(… f 18 27 p
8 audi-a4… audi a4 qu… 1.8 1999 4 manua… 4 18 26 p
9 audi-a4… audi a4 qu… 1.8 1999 4 auto(… 4 16 25 p
10 audi-a4… audi a4 qu… 2 2008 4 manua… 4 20 28 p
# … with 224 more rows, and 1 more variable: class <chr>
感覺下面幾個(gè)函數(shù)對(duì)于數(shù)據(jù)框的操作沒有太大的幫助
str_flatten()
str_dup()
str_split_fixed()
str_split()
str_split_n()
str_glue()
str_glue_data()
5.6 字符排序
str_order()
str_sort()
6. forcats
6.1 base
包中關(guān)于因子的函數(shù)
factor()
levels()
as_factor()
> qq <- c("d", "g", "a", "e", "f", "a", "e")
> qq <- factor(qq)
6.2 查看
-
fct_count()
: 查看各個(gè)level的數(shù)量
6.3 重新排序
-
fct_relevel()
: 手動(dòng) -
fct_infreq()
: 根據(jù)level出現(xiàn)的頻率 -
fct_inorder()
: 根據(jù)level出現(xiàn)的順序 -
fct_rev()
: 顛倒 -
fct_shift()
: 平移 -
fct_shuffle()
: 隨機(jī)排序 -
fct_reorder()
: 根據(jù)其他變量進(jìn)行排序冯痢,這個(gè)應(yīng)該很有用 -
fct_reorder2()
:
6.4 改變levels值
-
fct_recode()
: 手動(dòng) -
fct_anon()
: -
fct_collapse()
: -
fct_lump
: 根據(jù)levels的頻率進(jìn)行操作氮昧,對(duì)于篩選數(shù)據(jù)很有用 -
fct_other()
:
6.6 添加或刪除levels
fct_drop()
fct_expand()
fct_explicit_na()
7. purrr
剛看了張金龍老師的R語言視頻課(20220302),他說他目前為止還沒用過這個(gè)功能浦楣。
我平時(shí)也就是簡單地整理表格數(shù)據(jù)袖肥,purrr
更適用于list
,我好像也用不到......振劳,等以后接觸到再學(xué)吧椎组。