#tbl對象
使用dplyr包預處理時建議使用tbl_df()函數或tbl_cube()函數或tbl_sql()函數將原數據轉換為tbl對象,因為dplyr包用C語言開發,對處理tbl對象是非常迅速的。語法:
tbl_df(src, ...)
tbl_cube(dimensions, measures)
tbl_sql(subclass, src, from, ..., vars = attr(from, 'vars'))
#觀測篩選
如果需要將數據集中的某些觀測進行篩選的話,可以使用filter()函數,語法如下:
filter(.data, ...)
.data為tbl對象
...為觀測篩選條件,類似於subset()函數中的用法,但不同的是filter()函數不能篩選某些變量。
例子:
df <- data.frame(x = c('a','b','c','a','b','e','d','f'), y = c(1,2,3,4,5,6,7,8))
df2tbl <- tbl_df(df)
filter(df2tbl,x %in% c('a','b'))
#變量選取
filter()函數只能將指定條件的觀測篩選出來,並不能篩選出只關心的變量,為了彌補這個缺陷,可以使用select()函數篩選指定的變量,而且比subset()函數更靈活,而且選擇變量的同時也可以重新命名變量。如果剔除某些變量的話,只需在變量前加上負號“-”。之所以說他比subset()函數靈活,是因為可以在select()函數傳遞如下參數:
starts_with(x, ignor.case = TRUE)#選擇以字符x開頭的變量
ends_with(x, ignor.case = TRUE)#選擇以字符x結尾的變量
contains(x, ignor.case = TRUE)#選擇所有包含x的變量
matches(x, ignor.case = TRUE)#選擇匹配正則表達式的變量
num_range('x', 1:5, width = 2)#選擇x01到x05的變量
one_of('x','y','z')#選擇包含在聲明變量中的
everything()#選擇所有變量,一般調整數據集中變量順序時使用
例子:
#將df2tbl數據集中的y變量放到x變量前
select(df2tbl,y,everything())
#篩選變量的同時,重新命名變量名
select(df2tbl, x1 = x, y1 = y)
#重命名變量
如果需要對數據集中的某些變量進行重命名的話,可直接使用rename()函數,語法如下:
rename(tbl, newname = oldname,...)
例子:
rename(df2tbl, x1 = x, y1 = y)
#數據排序
數據預處理過程中往往也需要按某些變量進行排序,dplyr包提供了非常便捷的arrange()函數實現排序功能,語法如下:
arrange(.data, ...)
arrange()函數默認以某個變量進行升序,如需降序則desc(var_name)即可。
例子:
arrange(df2tbl, y) #默認升序
arrange(df2tbl, desc(y)) #降序操作
#數據擴展
通過mulate()函數可以在原始數據集的基礎上擴展新變量,類似於transform()函數,語法如下:
mutate(.data, ...)
例子:
mutate(df2tbl, z = y^2 + y - 10)
同樣可以進行數據擴展的還有transmute()函數,與mutate()函數不同的是,該函數擴展新變量的同時,將刪除所有原始變量。
例子:
transmute(df2tbl, z = y^2 + y - 10)
#數據聚合
在數據庫操作中,往往需要進行聚合函數的應用,這里同樣可以很方面使用summarize()函數實現數據集聚合操作,語法如下:
summarize(.data, ...)
可以用來聚合的函數有:
min():返回最小值
max():返回最大值
mean():返回均值
sum():返回總和
sd():返回標准差
median():返回中位數
IQR():返回四分位極差
n():返回觀測個數
n_distinct():返回不同的觀測個數
first():返回第一個觀測
last():返回最后一個觀測
nth():返回n個觀測
例子:
summarize(df2tbl, max(y))
summarize(df2tbl, n())
而且該函數還可以結合group_by()函數實現分組聚合,group_by()函數語法:
group_by(.data, ..., add = FALSE)
例子:
summarize(group_by(df2tbl,x), sum(y))
#數據關連
我們知道,數據庫中經常需要將多個表進行連接操作,如左連接、右連接、內連接等,這里dplyr包也提供了數據集的連接操作,具體如下:
inner_join#內連
left_join#左連
right_join#右連
full_join#全連
semi_join#返回能夠與y表匹配的x表所有記錄
anti_join#返回無法與y表匹配的x表的所記錄
例子:
df2 <- data.frame(x = c('a','b','c'), z = c('A','B','C'))
df2tbl2 <- tbl_df(df2)
inner_join(x = df2tbl, y = df2tbl2, by = 'x')
semi_join(x = df2tbl, y = df2tbl2, by = 'x')
anti_join(x = df2tbl, y = df2tbl2, by = 'x')
#數據合並
在R基礎包里有cbind()函數和rbind()函數實現按列的方向進行數據合並和按行的方向進行數據合並,而在dplyr包中也添加了類似功能的函數,它們是bind_cols()函數和bind_rows()函數。
例子:
mydf1 <- data.frame(x = c(1,2,3,4), y = c(10,20,30,40))
mydf2 <- data.frame(x = c(5,6), y = c(50,60))
mydf3 <- data.frame(z = c(100,200,300,400))
bind_rows(mydf1, mydf2)
bind_cols(mydf1, mydf3)
需要說明的是,bind_rows()函數需要兩個數據框或tbl對象有相同的列數,而bind_cols()函數則需要兩個數據框或tbl對象有相同的行數。
#管道函數
這里介紹一種dplyr包中特有的管道函數,即通過%>%將上一個函數的輸出作為下一個函數的輸入。
例子:根據數據集df2tbl和df2tbl2,取出z變量對應的最大y值
inner_join(x = df2tbl, y = df2tbl2, by = 'x') %>% group_by(., z) %>% summarize(., max(y))
#連接數據庫數據
如果需要獲取MySQL數據庫中的數據時,可以直接使用dplyr包中的src_mysql()函數,其功能類似於RMySQL包。src_mysql()函數語法如下:
src_mysql(dbname, host = NULL, port = 0L, user = "root", password = "",
...)
通過以上方式連接MySQL數據庫后,使用tbl()函數獲取數據集,tbl()函數語法如下:
tbl(src,from = '')
src為src_mysql()函數對象
from為SQL語句
例子:
src <- src_mysql('test', host = 'localhost', user = 'root', password = 'snake')
src
#獲取指定表中的數據
tbl(src, from = 'diff')
參考資料
每天進步一點點文章: https://sanwen8.cn/p/13dlTa8.html