不成系統(tǒng)學(xué)習(xí)的好處频敛,是會(huì)根據(jù)所需要的通過(guò)檢索一個(gè)個(gè)解決問(wèn)題蝶糯,但耽誤的時(shí)間不一定少;系統(tǒng)學(xué)習(xí)的缺點(diǎn)就是一開(kāi)始可能會(huì)無(wú)聊的堅(jiān)持不下去系奉。在處理數(shù)據(jù)時(shí)箭阶,覺(jué)得頭疼的數(shù)據(jù)挤安,其實(shí)dplyr包就可以簡(jiǎn)潔的解決掉谚殊,太贊了丧鸯。
來(lái)源于:dplyr 包的強(qiáng)大之處;R語(yǔ)言必學(xué)包之dplyr包
主要函數(shù)
-select围肥、rename、filter蜂怎、mutate, transmute穆刻、group_by、summarize
選擇
select函數(shù)
- starts_with(match, ignore.case = TRUE, vars = current_vars()): 列名以前綴開(kāi)始;
- ends_with(match, ignore.case = TRUE, vars = current_vars()): 列名以后綴結(jié)束;
- contains(match, ignore.case = TRUE, vars = current_vars()): 列名中包含指定字符串;
#選取變量名中包含etal的列
select(iris, contains("etal"))
- matches(match, ignore.case = TRUE, vars = current_vars()): 列名匹配正則表達(dá)式;
#正則表達(dá)式匹配杠步,返回變量名中包含ta的列
select(iris, matches(".ta."))
- num_range(prefix, range, width = NULL, vars = current_vars()): prefix
接受一個(gè)前綴, range 接受數(shù)字序列; - one_of(…, vars = current_vars()): 列名包含在其中;
- everything(vars = current_vars()): 所有的列名.
rename函數(shù)
這里需要注意的是, 我們使用 select 函數(shù)則在結(jié)果中只會(huì)保留選擇的列.
如果我們只是需要對(duì)特定列進(jìn)行重命名, 而需要保留原來(lái)其他的列, 則可以使用 rename 函數(shù).
iris %>% rename(sp.name = Species)
rename(iris,sp.name = Species)
篩選: filter() 和slice()函數(shù)
可以按給定的邏輯條件篩選出符合要求的子數(shù)據(jù)集;
- filter()
#過(guò)濾出cyl == 8的行
filter(mtcars, cyl == 8)
filter(mtcars, cyl < 6)
#過(guò)濾出cyl < 6 并且 vs == 1的行
filter(mtcars, cyl < 6 & vs == 1)
filter(mtcars, cyl < 6, vs == 1)
#過(guò)濾出cyl < 6 或者 vs == 1的行
filter(mtcars, cyl < 6 | vs == 1)
#過(guò)濾出cyl 為4或6的行
filter(mtcars, cyl %in% c(4, 6))
- slice()
slice() 函數(shù)通過(guò)行號(hào)選取數(shù)據(jù)朵锣。
#選取第一行數(shù)據(jù)
slice(mtcars, 1L)
filter(mtcars, row_number() == 1L)
#選取最后一行數(shù)據(jù)
slice(mtcars, n())
filter(mtcars, row_number() == n())
#選取第5行到最后一行所有數(shù)據(jù)
slice(mtcars, 5:n())
filter(mtcars, between(row_number(), 5, n()))
改變列值
mutate 函數(shù)會(huì)保留修改后的列和修改之前的列,
transmute 函數(shù)則會(huì)保留修改后的列而丟棄修改之前的列
- 可以用于 mutate 和 transmute 函數(shù)還有許多輔助函數(shù):
log(), log2(), log10(): 對(duì)值求 log;
lead(), lag(): 返回序列中當(dāng)前位置前第幾個(gè)值或后第幾個(gè)值;
row_number(): 結(jié)果等于 rank(ties.method = "first"), 即對(duì)于相同的數(shù)值的排名按照先后順序排;
min_rank(): 結(jié)果等于 `rank(ties.method = "min"), 即對(duì)于相同的數(shù)值的排名都取最小的排名;
dense_rank(): 結(jié)果類似于 min_rank(), 差別在于填充了由于 min_rank 造成的排名空隙;
percent_rank(): 把 min_rank() 的值轉(zhuǎn)換為 0 到 1 區(qū)間;
cume_dist(): 計(jì)算比當(dāng)前值還小的值的比例, 相當(dāng)于計(jì)算 density;
ntile(): 把數(shù)據(jù)分成若干塊, 看每個(gè)數(shù)據(jù)在具體拿一個(gè)塊;
cumsum(), cummean(), cummin(), cummax(), cumany(), cumall(): 累積地 (cumulative) 計(jì)算和 (sum), 均值 (mean), 最小值 (min), 最大值 (max), 任何為真 (any), 所有為真 (all);
na_if(): 把特定地值轉(zhuǎn)換為 NA;
coalesce(): 找出若干列中第一個(gè)不為 NA 的值;
if_else(): 向量化的 ifelse 函數(shù)的效果.
recode: 把一系列值轉(zhuǎn)換為其他值
case_when: 多條件選擇
分割-應(yīng)用-整合
可以使用 group_by 和 summarize 函數(shù)來(lái)獲得iris每個(gè)物種的每一種屬性的均值
- 眾多的函數(shù)可以用于 summarize 函數(shù).
mean(), median(), max(), min(), sd(),
IQR(), mad() 等統(tǒng)計(jì)函數(shù).
first(), last(), nth(): 返回第幾位的值.
n(): 計(jì)算數(shù)據(jù)的數(shù)量, 相當(dāng)于 length() 函數(shù).
n_distinct(): 計(jì)算非重復(fù)數(shù)據(jù)的數(shù)量, 相當(dāng)于 length(unique(x)).
any(), all(): 邏輯計(jì)算函數(shù)
排序
arrange 函數(shù)對(duì)數(shù)據(jù)進(jìn)行從小到大排序.
desc 函數(shù)可以實(shí)現(xiàn)從大到小排序
#以cyl和disp聯(lián)合升序排序
arrange(mtcars, cyl, disp)
#以disp降序排序
arrange(mtcars, desc(disp))
去重: distinct
distinct()用于對(duì)輸入的tbl進(jìn)行去重诚些,返回?zé)o重復(fù)的行
df <- data.frame(
x = sample(10, 100, rep = TRUE),
y = sample(10, 100, rep = TRUE)
)
#以全部?jī)蓚€(gè)變量去重皇型,返回去重后的行數(shù)
nrow(distinct(df))
nrow(distinct(df, x, y))
#以變量x去重诬烹,只返回去重后的x值
distinct(df, x)
#以變量y去重,只返回去重后的y值
distinct(df, y)
#以變量x去重幢痘,返回所有變量
distinct(df, x, .keep_all = TRUE)
#以變量y去重掀泳,返回所有變量
distinct(df, y, .keep_all = TRUE)
#對(duì)變量運(yùn)算后的結(jié)果去重
distinct(df, diff = abs(x - y))