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

 找回密码
 注册会员

扫一扫,访问微社区

查看: 17680|回复: 1
打印 上一主题 下一主题

[函数] R语言 dplyr包重要函数

[复制链接]
  • TA的每日心情
    奋斗
    2015-7-30 23:05
  • 签到天数: 12 天

    [LV.3]偶尔看看II

    852

    主题

    972

    帖子

    4804

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    4804
    QQ
    跳转到指定楼层
    楼主
    发表于 2015-10-3 21:09:47 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    介绍完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免费公开课

    回复

    使用道具 举报

    该用户从未签到

    0

    主题

    7

    帖子

    25

    积分

    新手上路

    Rank: 1

    积分
    25
    沙发
    发表于 2016-4-20 17:42:55 | 只看该作者
    非常感谢,支持多多共享好的资源
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 登录 | 注册会员

    本版积分规则

    关闭

    站长推荐上一条 /2 下一条


    id="mn_portal" >首页Portalid="mn_P18" onmouseover="navShow('P18')">应用id="mn_P15" onmouseover="navShow('P15')">技术id="mn_P37" onmouseover="showMenu({'ctrlid':this.id,'ctrlclass':'hover','duration':2})">前沿id="mn_P36" onmouseover="navShow('P36')">宝箱id="mn_P61" onmouseover="showMenu({'ctrlid':this.id,'ctrlclass':'hover','duration':2})">专栏id="mn_P65" >企业id="mn_Nd633" >导航 折叠导航 关注微信 关注微博 关注我们

    QQ|广告服务|关于我们|Archiver|手机版|小黑屋|大数据人 ( 鄂ICP备14012176号-2  

    GMT+8, 2024-5-6 03:25 , Processed in 0.258905 second(s), 30 queries .

    Powered by 小雄! X3.2

    © 2014-2020 bigdataer Inc.

    快速回复 返回顶部 返回列表