大数据人|大数据第一社区
标题: R语言 dplyr包重要函数 [打印本页]
作者: admin 时间: 2015-10-3 21:09
标题: R语言 dplyr包重要函数
介绍完dplyr包中的基础函数后,我们可以看看dplyr包中的一些高级函数,这些函数的作用有:数据联接,数据分组,数据合并,随机抽取数据集中的数据行,管道操作符。顺便介绍一下plyr包中的colwise函数,它可以对数据集中的每一列数据进行函数运算。
数据集的联接
对于数据的联接,学过数据库的应该不陌生。这里主要介绍4种联接方式及其作用。
首先建立测试数据。
> id <- c(1:5)
> gender <- c(rep(c(0,1),2),1)
> score <- rnorm(5,90,1)
> grade <- sample(c(2014,2015),size=5,replace=T)
> df1 <- data.frame(id,gender)
> df2 <- data.frame(score,id,grade)[-5,]
(1)inner_join
参数设置:inner_join(x,y,by=””)
功能:返回x中与y相匹配的所有行,及x与y的所有列。
> inner_join(df1,df2,by="id")
(2)left_join
参数设置:left_join(x,y,by=””)
功能:返回x的所有行及x与y的所有列,x中有而y中没有的以NA表示。
> left_join(df1,df2,by = "id")
(3)semi_join
参数设置:semi_join(x,y,by=””)
功能:返回x中与y匹配的所有行,仅保留x中的所有列。
> semi_join(df1,df2,by = "id")
(4)anti_join
参数设置:anti_join(x,y,by=””)
功能:返回x中与y不匹配的行,仅保留x中的所有列
> anti_join(df1,df2,by = "id")
数据集的分组
数据的分组可以采用group_by函数。
参数设置:group_by(.data, ...)
.data是待分组的数据,之后是分组变量,可以是多个变量。
> by_vs_am <- group_by(mtcars, vs, am)
> by_vs_am
分组后的数据会显示有Groups,之后就可以对分组数据进行统计计算。
> by_vs <- summarise(by_vs_am, n = n()) #进行分组计数
> by_vs
对已经分组的数据,可以采用ungroup来消除分组
> summarise(by_vs, n = sum(n))
> summarise(ungroup(by_vs), n = sum(n))
当然,我们也可以在原数据中添加分组变量
> group_by(mtcars, vsam = vs + am)
一般来说,group_by和summmarise的混合操作会使得数据的清洗变得非常简单。
数据集的行列合并
相对于基础函数中的行列合并函数rbind与cbind,dplyr包中有bind_rows和bind_cols,注意到这个是按照位置进行合并,所以行(列)数一定要相同。类似的还有union函数,它对x与y进行行合并,相同的行只出现一次。
one <- mtcars[1:4, ]
two <- mtcars[11:14, ]
bind_rows(one, two)
bind_cols(one, two)
对数据进行计数
plyr包中的计数函数有tally,count。功能类似的还有group_size,其中,count函数最为灵活。
tally
参数设置:tally(x, wt, sort = FALSE)
x是tabl对象或数据框,wt是权重变量,sort是否排序,排序是降序排序
> mtcars2 <- group_by(mtcars,cyl)
不加权
> tally(mtcars , sort= T)
> tally(mtcars2 , sort= T) #分组计数
加权计数
> tally(mtcars,wt = cyl,sort= T)
> tally(mtcars2,wt = cyl,sort= T)
count
相对于tally函数,count函数可以实现直接分组,无须事先分组。
参数设置:count(x, ..., wt = NULL, sort = FALSE)
不分组,不加权
>count(mtcars2,sort = T)
分组,不加权
> count(mtcars,cyl,sort=T)
既分组又加权
> count(mtcars,cyl, wt = cyl ,sort = T)
对数据集进行随机抽取
对数据集进行随机抽取,虽然通过基础函数也可以实现,但有dplyr包提供了更好的函数:sample_n
参数设置:sample_n(tbl, size, replace = FALSE, weight = NULL, .env = parent.frame())
size 表示抽取行个数
sample_frac(tbl, size = 1, replace = FALSE, weight = NULL,.env = parent.frame())
size表示抽取数据集行数的size倍。
by_cyl <- mtcars %>% group_by(cyl)
sample_n(mtcars, 10)
sample_n(mtcars, 50, replace = TRUE)
sample_n(mtcars, 10, weight = mpg)
可以对数据集进行分层抽样,但是抽样数大于层内数据个数时,需要将replace设置为T
sample_n(by_cyl, 3)
sample_n(by_cyl, 10, replace = TRUE)
sample_frac(mtcars, 0.1)
管道操作符
dplyr包自称为数据操作的语法,这里介绍一种管道操作符:%>%。这种操作符的作用是将左边的数据传递到右边的函数中,可以将上一个函数的输出作为一下函数的输入。管道操作符可以使你顺着思路进行数据处理,而不必不断地进行数据框的建立。下面举例说明,同样的结果用管道操作符要更容易理解一些。
一般操作
> m1 <- group_by(mtcars,cyl,vs,am)
> m2 <- select(m1,disp,mpg)
> m3 <- summarise(m2,mdisp = mean(disp),mmpg = mean(mpg))
> m4 <- filter(m3,mdisp > 120 & mmpg >20)
> m4
%>%操作
> mtcars %>%
+ group_by(cyl,vs,am) %>%
+ select(disp,mpg) %>%
+ summarise(mdisp = mean(disp),mmpg = mean(mpg)) %>%
+ filter(mdisp > 120 & mmpg > 20)
plyr包的colwise函数
最后,介绍一下plyr包中的colwise函数,它可以自动对数据集每一列调用函数,计算结果。
colwise(function)(data.frame)
> colwise(n_distinct)(by_cyl)
mpg disp hp drat wt qsec vs am gear carb
1 25 27 22 22 29 30 2 2 3 6
以上就是dplyr包中的主要函数了,其他的还有set系列函数,cum系列函数,但不是很重要,有兴趣的可以自己翻看一下自带文档。
参考资料
1.dplyr包文档
2.使用 dplyr 包进行数据操作与清洗
3.R语言扩展包dplyr笔记 (转载)
4.雪晴数据网:R语言高效数据清理工具包dplyr免费公开课
作者: 小R来逛逛 时间: 2016-4-20 17:42
非常感谢,支持多多共享好的资源
欢迎光临 大数据人|大数据第一社区 (http://www.bigdata.ren/) |
Powered by Discuz! X3.2 |