标签:
在我们数据分析的实际应用中,我们可能会花费大量的时间在数据清洗上,而如果使用 R 里面自带的一些函数(base 包的 transform 等),可能会觉得力不从心,或者不是很人性化。好在我们有其他选择。这里我们介绍 dplyr 包。
首先加载包:
install.packages("dplyr") library(dplyr)
单表操作函数(one table verbs)如下:
filter: 保留满足条件的行 select: 使用列名选出列 arrange: 对数据的所有行排序 mutate: 添加新的变量 summarise: 分类汇总
这些函数的结构如下:
operationName(.data, ...)
operationName _(.data, ..., .dots)
# transmute对已有列进行数据运算并添加为新列删除原来的列
transmute(.data, ...)
transmute_(.data, ..., .dots)
# slice根据位置选择行
slice(.data, ...)
slice_(.data, ..., .dots)
参数说明:
为了更好地表述我们的操作,这里使用一个构造的 data frame。
df <- data.frame(color = c("blue", "black", "blue", "blue", "black"),value = 1:5) View(df)
# filter返回满足条件的行
filter(.data, ...)
filter_(.data, ..., .dots)
filter 用于选择满足条件的观测(行),第一个参数是 data frame 名字,第二个参数是条件。这里举两个例子,我们对上面构造的 data frame 进行 filter 操作。第一个例子要求选取 color == blue 的观测; 第二个例子要求选取 value == 1 或者 value == 4 的观测。
# 选取 `color == blue` 的观测 > filter(df, color == "blue") ## color value ## 1 blue 1 ## 2 blue 3 ## 3 blue 4 # 选取 `value == 1` 或者 `value == 4 ` 的观测。 > filter(df, value %in% c(1, 4)) ## color value ## 1 blue 1 ## 2 blue 4
效果如下:
注意: 这里需要提醒的是,对于多条件的选择,需要完整条件的,然后使用集合运算符将条件拼接起来。集合运算符有 !、|、&、xor(交补)。条件的判断符有>(=)、<(=)、==、!=、%in% (判断元素是否在集合或者列表内,返回逻辑值)。如下:
filter(flights, dest %in% c("SFO", "OAK")) filter(flights, dest == "SFO" | dest == "OAK") # 下面是错误写法 filter(flights, dest == "SFO" | "OAK")
# select选择需要的变量keeps only the variables you mention select(.data, ...) select_(.data, ..., .dots)
select用于选择需要的列:
> select(df, color) ## color ## 1 blue ## 2 black ## 3 blue ## 4 blue ## 5 black > select(df, -color) ## value ## 1 1 ## 2 2 ## 3 3 ## 4 4 ## 5 5
注意:select 中负号表示不选择。其中变量的声明还有其他形式,比如B:F表示从 B 列到 F 列所有列;ends_with("string") 表示选取列名以 string 结尾的全部列;contains("string") 表示选取列名中含有 string 的所有列。代码如下:
select(flights, arr_delay, dep_delay) select(flights, arr_delay:dep_delay) select(flights, ends_with("delay")) select(flights, contains("delay"))
select()函数,传递的参数:
# arrange按给定的列名依次对行进行排序.
arrange(.data, ...)
arrange_(.data, ..., .dots)
arrange 用于根据变量排序,如果排序依据(列)是字符,按照字母表的顺序,如果是数字,默认按照从小到大的顺序排序,如果需要使用逆序排,可以使用desc(var) 或者 -var。
> arrange(df, color) ## color value ## 1 black 2 ## 2 black 5 ## 3 blue 1 ## 4 blue 3 ## 5 blue 4 > arrange(df, desc(value)) ## color value ## 1 black 5 ## 2 blue 4 ## 3 blue 3 ## 4 black 2 ## 5 blue 1
注意:多个排序依据直接把列名放在函数内,用逗号隔开;可以在排序里面使用计算,比如:
arrange(flights, date, hour, minute)
arrange(flights, desc(dep_delay - arr_delay))
# mutate对已有列进行数据运算并添加为新列并保存已有列和新列
mutate(.data, ...)
mutate_(.data, ..., .dots)
mutate 用于添加新的变量,直接使用列名进行计算得到新变量即可。而且它很有特色地方是,可以使用刚添加的变量,也就是在一个语句中可以多个变量,而且变量可以来源于刚新建的变量。
> mutate(df, double = 2 * value, quadruple = 2 * double) ## color value double quadruple ## 1 blue 1 2 4 ## 2 black 2 4 8 ## 3 blue 3 6 12 ## 4 blue 4 8 16 ## 5 black 5 10 20
# summarise分类汇总Summarise multiple values to a single value
summarise(.data, ...)
summarise_(.data, ..., .dots)
summarise 可以用于“分类汇总”,但不是传统意义上的分类汇总,它还能做更多。
实际上它是把我们现有的完整 data frame 依据分组依据(这里是 color)拆分成多个data frame,然后对每个 data frame 分别计算,类似于ddply。
使用经历:分组依据可以多个,比如根据城市、月份、年份,我们对数据进行分类汇总,可以得到每个城市每一年每月的情况。
summarise 可以使用的函数有:
summarize(df,max(y))
summarize(df,n())
> by_color <- group_by(df, color) # 分组依据 > summarise(by_color, total = sum(value)) # 分组求和 ## Source: local data frame [2 x 2] ## color total ## 1 black 7 ## 2 blue 8
# rename 保留所有变量keeps all variables
rename(.data, ...)
rename_(.data, ..., .dots)
rename(tbl,newname = oldname,…)
示例:
rename(dftbl,x1 = x,y1 = y)
rename(iris, petal_length = Petal.Length)
以上函数已经很方便了, 但是当它们跟分组操作这个概念结合起来时, 那才叫真正的强大! 当对数据集通过 group_by() 添加了分组信息后,mutate(), arrange() 和 summarise() 函数会自动对这些 tbl 类数据执行分组操作 (R语言泛型函数的优势). group_by()函数指定tbl对象中的一个分组对象,再根据这个分组对象进行分类汇总.
例如: 对飞机航班数据按飞机编号 (TailNum) 进行分组, 计算该飞机航班的次数 (count = n()), 平均飞行距离 (dist = mean(Distance, na.rm = TRUE)) 和 延时 (delay = mean(ArrDelay, na.rm = TRUE))
planes <- group_by(hflights_df, TailNum) delay <- summarise(planes, count = n(), dist = mean(Distance, na.rm = TRUE), delay = mean(ArrDelay, na.rm = TRUE)) delay <- filter(delay, count > 20, dist < 2000)
用 ggplot2 包作个图观察一下, 发现飞机延时不延时跟飞行距离没太大相关性:
ggplot(delay, aes(dist, delay)) + geom_point(aes(size = count), alpha = 1/2) + geom_smooth() + scale_size_area()
数据框中经常需要将多个表进行连接操作,如左连接、右连接、内连接等,这里dplyr包也提供了数据集的连接操作。如下:
x=data.frame(name=c("John","Paul","George","Ringo","Stuart","Pete"), instrument= c("guitar","guitar","drums","bass","drums","bass")) y=data.frame(name=c("John","Paul","George","Ringo","Brian"), band=c("TRUE","TRUE","TRUE","TRUE","FALSE")) View(x) View(y)
View(left_join(x,y)) #把y表追加到x表后面
View(inner_join(x,y))
View(right_join(x,y))
View(semi_join(x,y))
View(anti_join(x,y))
View(full_join(x,y))
将上一个函数的输出作为下一个函数的输入,%.%已废弃
示例:
Batting数据集如下:
library(Lahman) Batting %>% group_by(playerID) %>% summarise(total = sum(G)) %>% arrange(desc(total)) %>% View()
# 一种写法 head(arrange(summarise(group_by(Batting, playerID), total = sum(G)) , desc(total)), 5) # 另一种写法 totals <- aggregate(. ~ playerID, data=Batting[,c("playerID","R")], sum) ranks <- sort.list(-totals$R) totals[ranks[1:5],]
如果需要获取MySQL数据库中的数据时,可以直接使用dplyr包中的src_mysql()函数:
src_mysql(dbname,host = NULL,port = 0L,user = “root”,password = “password”,…)
示例如下:
#dplyr连接mysql数据库 library(dplyr) my_db <- src_mysql(dbname = "rmysql", host = localhost, port = 3306, user = "rmysql", password = "rmysql") my_tbl <- tbl(my_db,from = "my_table") #my_table为数据库中的表
本文链接:http://www.cnblogs.com/homewch/p/5778402.html
标签:
原文地址:http://www.cnblogs.com/homewch/p/5778402.html