admin 发表于 2015-10-3 21:09:47

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

小R来逛逛 发表于 2016-4-20 17:42:55

非常感谢,支持多多共享好的资源
页: [1]
查看完整版本: R语言 dplyr包重要函数