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 <- mtcarstwo <- mtcarsbind_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设置为Tsample_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 125 27 22 22 29 3022 3 6 以上就是dplyr包中的主要函数了,其他的还有set系列函数,cum系列函数,但不是很重要,有兴趣的可以自己翻看一下自带文档。
参考资料 1.dplyr包文档 2.使用 dplyr 包进行数据操作与清洗 http://ddswhu.com/2015/02/05/dplyr-data-clean-manipulation/ 3.R语言扩展包dplyr笔记 (转载) http://bbs.pinggu.org/thread-3514627-1-1.html 4.雪晴数据网:R语言高效数据清理工具包dplyr免费公开课
http://www.xueqing.cc/course/index/view/id/31
非常感谢,支持多多共享好的资源
页:
[1]