大数据人|大数据第一社区

标题: 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 包进行数据操作与清洗
    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
非常感谢,支持多多共享好的资源




欢迎光临 大数据人|大数据第一社区 (http://www.bigdata.ren/) Powered by Discuz! X3.2